সিএসভি কলামগুলিকে শ্রেণিবিন্যাসের সম্পর্কগুলিতে রূপান্তর করার কোনও উপায় আছে কি?


27

আমার কাছে v মিলিয়ন জীববৈচিত্র্যের রেকর্ডের সিএসভি রয়েছে যেখানে ট্যাক্সনোমি স্তরগুলি কলাম হিসাবে। এই ক্ষেত্রে:

RecordID,kingdom,phylum,class,order,family,genus,species
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis
3,Plantae,nan,Magnoliopsida,Brassicales,Brassicaceae,Arabidopsis,Arabidopsis thaliana
4,Plantae,nan,Magnoliopsida,Fabales,Fabaceae,Phaseoulus,Phaseolus vulgaris

আমি ডি 3 এ একটি ভিজ্যুয়ালাইজেশন তৈরি করতে চাই, তবে ডেটা ফর্ম্যাটটি অবশ্যই একটি নেটওয়ার্ক হওয়া উচিত, যেখানে কলামের প্রতিটি পৃথক মান একটি নির্দিষ্ট মানের জন্য পূর্ববর্তী কলামের শিশু। আমাকে সিএসভি থেকে এরকম কিছুতে যেতে হবে:

{
  name: 'Animalia',
  children: [{
    name: 'Chordata',
    children: [{
      name: 'Mammalia',
      children: [{
        name: 'Primates',
        children: 'Hominidae'
      }, {
        name: 'Carnivora',
        children: 'Canidae'
      }]
    }]
  }]
}

লুপের জন্য হাজার ব্যবহার না করে কীভাবে এটি করা যায় সে সম্পর্কে আমি ধারণা নিয়ে আসিনি। পাইথন বা জাভাস্ক্রিপ্টে এই নেটওয়ার্কটি কীভাবে তৈরি করা যায় সে সম্পর্কে কারও কি পরামর্শ আছে?


আপনার প্রশ্নের সাথে সম্পর্কিত নয়, তবে আমি আমার উত্তর লেখার ঠিক পরে আমি খেয়াল করেছিলাম nanম্যাগনোলিপিডাসহ ফিলামের জন্য একটি । ওটা কি nan? ফিলিয়াম হ'ল অ্যান্টোফাইটা, বা বিকল্পভাবে ম্যাগনোলিয়া (এটি পুরাতন ফিলিয়াম অ্যাঞ্জিওস্পার্মাই)।
জেরার্ডো ফারতাডো

উত্তর:


16

সঠিক নেস্টেড অবজেক্ট তৈরির জন্য আপনি চান আমরা খাঁটি জাভাস্ক্রিপ্টের মিশ্রণ এবং একটি ডি 3 পদ্ধতি ব্যবহার করব d3.stratify। তবে মনে রাখবেন 7 মিলিয়ন সারি (দয়া করে পোস্ট স্ক্রিটামটি দেখুন) নীচের দেখুন) গণনা করার মতো অনেক কিছুই।

এটি উল্লেখ করা খুব গুরুত্বপূর্ণ যে, এই প্রস্তাবিত সমাধানের জন্য আপনাকে পৃথক পৃথক ডেটা অ্যারে (উদাহরণস্বরূপ, ব্যবহার করে Array.prototype.filter) আলাদা করতে হবে । এই বিধিনিষেধটি ঘটে কারণ আমাদের একটি রুট নোডের প্রয়োজন, এবং লিন্ন বিভাগে রাজ্যের মধ্যে কোনও সম্পর্ক নেই (যদি না আপনি "ডোমেন" তৈরি করেন তবে শীর্ষস্থান হিসাবে যা সমস্ত ইউক্যারিওটসের মূল হবে, তবে তারপরে আপনার একই রকম থাকবে) আরচিয়া এবং ব্যাকটিরিয়ার সমস্যা)।

সুতরাং, ধরুন আপনার কাছে কেবলমাত্র একটি কিংডম সহ এই সিএসভি (আমি আরও কয়েকটি সারি যুক্ত করেছি):

RecordID,kingdom,phylum,class,order,family,genus,species
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis latrans
3,Animalia,Chordata,Mammalia,Cetacea,Delphinidae,Tursiops,Tursiops truncatus
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Pan,Pan paniscus

সেই সিএসভির উপর ভিত্তি করে, আমরা এখানে একটি অ্যারে তৈরি করব tableOfRelationshipsযা নাম থেকেই বোঝা যাচ্ছে যে এই স্তরের মধ্যে সম্পর্ক রয়েছে:

const data = d3.csvParse(csv);

const taxonomicRanks = data.columns.filter(d => d !== "RecordID");

const tableOfRelationships = [];

data.forEach(row => {
  taxonomicRanks.forEach((d, i) => {
    if (!tableOfRelationships.find(e => e.name === row[d])) tableOfRelationships.push({
      name: row[d],
      parent: row[taxonomicRanks[i - 1]] || null
    })
  })
});

উপরের তথ্যগুলির জন্য, এটি হ'ল tableOfRelationships:

+---------+----------------------+---------------+
| (Index) |         name         |    parent     |
+---------+----------------------+---------------+
|       0 | "Animalia"           | null          |
|       1 | "Chordata"           | "Animalia"    |
|       2 | "Mammalia"           | "Chordata"    |
|       3 | "Primates"           | "Mammalia"    |
|       4 | "Hominidae"          | "Primates"    |
|       5 | "Homo"               | "Hominidae"   |
|       6 | "Homo sapiens"       | "Homo"        |
|       7 | "Carnivora"          | "Mammalia"    |
|       8 | "Canidae"            | "Carnivora"   |
|       9 | "Canis"              | "Canidae"     |
|      10 | "Canis latrans"      | "Canis"       |
|      11 | "Cetacea"            | "Mammalia"    |
|      12 | "Delphinidae"        | "Cetacea"     |
|      13 | "Tursiops"           | "Delphinidae" |
|      14 | "Tursiops truncatus" | "Tursiops"    |
|      15 | "Pan"                | "Hominidae"   |
|      16 | "Pan paniscus"       | "Pan"         |
+---------+----------------------+---------------+

nullএর অভিভাবক হিসাবে একবার দেখুন Animalia: সে কারণেই আমি আপনাকে বলেছিলাম যে আপনাকে আপনার ডেটাসেটকে কিংডম দ্বারা আলাদা করতে হবে null, পুরো টেবিলের মধ্যে একটি মাত্র মান থাকতে পারে ।

অবশেষে, সেই টেবিলের উপর ভিত্তি করে, আমরা এই ব্যবহার করে শ্রেণিবিন্যাস তৈরি করি d3.stratify():

const stratify = d3.stratify()
    .id(function(d) { return d.name; })
    .parentId(function(d) { return d.parent; });

const hierarchicalData = stratify(tableOfRelationships);

এবং এখানে ডেমো। আপনার ব্রাউজারের কনসোলটি খুলুন (স্নিপেটের একটিটি এই কাজের জন্য খুব ভাল নয়) এবং childrenবস্তুর বিভিন্ন স্তরের ( ) পরীক্ষা করুন :


পিএস : আপনি কী ধরণের ডেটাভিজ তৈরি করবেন তা আমি জানি না তবে আপনার সত্যিকারের ট্যাক্সোনমিক র‌্যাঙ্কগুলি এড়ানো উচিত। পুরো লিনেইন শ্রমশক্তিটি পুরানো, আমরা আর পদক্ষেপ ব্যবহার করি না: যেহেতু ফাইলোজেনেটিক সিস্টেমটি -০-এর দশকের মাঝামাঝি সময়ে তৈরি হয়েছিল আমরা কোনও ট্যাক্সোমিক র‌্যাঙ্ক ছাড়াই কেবলমাত্র ট্যাক্সি ব্যবহার করি (বিবর্তনীয় জীববিজ্ঞানের শিক্ষক এখানে)। এছাড়াও, আমি এই 7 মিলিয়ন সারি সম্পর্কে বেশ কৌতূহলী, যেহেতু আমরা মাত্র 1 মিলিয়ন প্রজাতির বর্ণনা দিয়েছি!


3
। @ জেরার্ডো আপনার উত্তরের জন্য ধন্যবাদ, আমি দেখতে পাচ্ছি এটি 7M সারিগুলির নমুনায় কাজ করে কিনা। ডাটাবেসে বহু প্রজাতির জন্য পুনরাবৃত্তি সারি রয়েছে। সুতরাং ধারণাটি নির্দিষ্ট ট্যাকনোমিক র‌্যাঙ্কের জন্য কতটি রেকর্ড রয়েছে তা দেখানো হবে। ধারণাটি হ'ল মাইক বোস্টকের জুম্যাবল আইসিকল গাছের অনুরূপ কিছু তৈরি করা ।
আন্দ্রেস কামিলো জুয়েগা গঞ্জালেজ

9

পাইথন এবং python-benedictলাইব্রেরি ব্যবহার করার জন্য আপনার যা প্রয়োজন ঠিক তা করা সহজ (এটি গিথুবের উন্মুক্ত উত্স :

স্থাপন pip install python-benedict

from benedict import benedict as bdict

# data source can be a filepath or an url
data_source = """
RecordID,kingdom,phylum,class,order,family,genus,species
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis
3,Plantae,nan,Magnoliopsida,Brassicales,Brassicaceae,Arabidopsis,Arabidopsis thaliana
4,Plantae,nan,Magnoliopsida,Fabales,Fabaceae,Phaseoulus,Phaseolus vulgaris
"""
data_input = bdict.from_csv(data_source)
data_output = bdict()

ancestors_hierarchy = ['kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species']
for value in data_input['values']:
    data_output['.'.join([value[ancestor] for ancestor in ancestors_hierarchy])] = bdict()

print(data_output.dump())
# if this output is ok for your needs, you don't need the following code

keypaths = sorted(data_output.keypaths(), key=lambda item: len(item.split('.')), reverse=True)

data_output['children'] = []
def transform_data(d, key, value):
    if isinstance(value, dict):
        value.update({ 'name':key, 'children':[] })
data_output.traverse(transform_data)

for keypath in keypaths:
    target_keypath = '.'.join(keypath.split('.')[:-1] + ['children'])
    data_output[target_keypath].append(data_output.pop(keypath))

print(data_output.dump())

প্রথম মুদ্রণ আউটপুট হবে:

{
    "Animalia": {
        "Chordata": {
            "Mammalia": {
                "Carnivora": {
                    "Canidae": {
                        "Canis": {
                            "Canis": {}
                        }
                    }
                },
                "Primates": {
                    "Hominidae": {
                        "Homo": {
                            "Homo sapiens": {}
                        }
                    }
                }
            }
        }
    },
    "Plantae": {
        "nan": {
            "Magnoliopsida": {
                "Brassicales": {
                    "Brassicaceae": {
                        "Arabidopsis": {
                            "Arabidopsis thaliana": {}
                        }
                    }
                },
                "Fabales": {
                    "Fabaceae": {
                        "Phaseoulus": {
                            "Phaseolus vulgaris": {}
                        }
                    }
                }
            }
        }
    }
}

দ্বিতীয় মুদ্রিত আউটপুট হবে:

{
    "children": [
        {
            "name": "Animalia",
            "children": [
                {
                    "name": "Chordata",
                    "children": [
                        {
                            "name": "Mammalia",
                            "children": [
                                {
                                    "name": "Carnivora",
                                    "children": [
                                        {
                                            "name": "Canidae",
                                            "children": [
                                                {
                                                    "name": "Canis",
                                                    "children": [
                                                        {
                                                            "name": "Canis",
                                                            "children": []
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "name": "Primates",
                                    "children": [
                                        {
                                            "name": "Hominidae",
                                            "children": [
                                                {
                                                    "name": "Homo",
                                                    "children": [
                                                        {
                                                            "name": "Homo sapiens",
                                                            "children": []
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "name": "Plantae",
            "children": [
                {
                    "name": "nan",
                    "children": [
                        {
                            "name": "Magnoliopsida",
                            "children": [
                                {
                                    "name": "Brassicales",
                                    "children": [
                                        {
                                            "name": "Brassicaceae",
                                            "children": [
                                                {
                                                    "name": "Arabidopsis",
                                                    "children": [
                                                        {
                                                            "name": "Arabidopsis thaliana",
                                                            "children": []
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "name": "Fabales",
                                    "children": [
                                        {
                                            "name": "Fabaceae",
                                            "children": [
                                                {
                                                    "name": "Phaseoulus",
                                                    "children": [
                                                        {
                                                            "name": "Phaseolus vulgaris",
                                                            "children": []
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

5

var log = console.log;
var data = `
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis
3,Plantae,nan,Magnoliopsida,Brassicales,Brassicaceae,Arabidopsis,Arabidopsis thaliana
4,Plantae,nan,Magnoliopsida,Fabales,Fabaceae,Phaseoulus,Phaseolus vulgaris`;
//make array of rows with array of values
data = data.split("\n").map(v=>v.split(","));
//init tree
var tree = {};
data.forEach(row=>{
    //set current = root of tree for every row
    var cur = tree; 
    var id = false;
    row.forEach((value,i)=>{
        if (i == 0) {
            //set id and skip value
            id = value;
            return;
        }
        //If branch not exists create. 
        //If last value - write id
        if (!cur[value]) cur[value] = (i == row.length - 1) ? id : {};
        //Move link down on hierarhy
        cur = cur[value];
    });
}); 
log("Tree:");
log(JSON.stringify(tree, null, "  "));

//Now you have hierarhy in tree and can do anything with it.
var toStruct = function(obj) {
    let ret = [];
    for (let key in obj) {
        let child = obj[key];
        let rec = {};
        rec.name = key;
        if (typeof child == "object") rec.children = toStruct(child);
        ret.push(rec);
    }
    return ret;
}
var struct = toStruct(tree);
console.log("Struct:");
console.log(struct);


5

এটি সোজা মনে হচ্ছে, তাই আমি আপনার সমস্যা বুঝতে পারছি না।

আপনি যে ডেটা স্ট্রাকচারটি চান তা হ'ল অভিধান, কী / মান জোড়ার একটি নেস্টেট সেট। আপনার শীর্ষ স্তরের কিংডম অভিধানে আপনার প্রতিটি রাজ্যের জন্য কী রয়েছে, যার মান ফিলিয়াম অভিধান। একটি ফিলিয়াম ডিকশনারি (এক রাজ্যের জন্য) প্রতিটি ফিলিয়াম নামের জন্য একটি কী থাকে এবং প্রতিটি কীতে একটি মান থাকে যা একটি শ্রেণি অভিধান এবং আরও অনেক কিছু।

এটিকে কোড সহজ করার জন্য, আপনার জেনাসের অভিধানগুলিতে প্রতিটি প্রজাতির জন্য একটি কী থাকবে তবে প্রজাতির মানগুলি খালি অভিধান হবে।

আপনি যা চান এটি হওয়া উচিত; কোন অদ্ভুত গ্রন্থাগার প্রয়োজন।

import csv

def read_data(filename):
    tree = {}
    with open(filename) as f:
        f.readline()  # skip the column headers line of the file
        for animal_cols in csv.reader(f):
            spot = tree
            for name in animal_cols[1:]:  # each name, skipping the record number
                if name in spot:  # The parent is already in the tree
                    spot = spot[name]  
                else:
                    spot[name] = {}  # creates a new entry in the tree
                    spot = spot[name]
    return tree

এটি পরীক্ষা করতে, আমি আপনার ডেটা এবং pprintস্ট্যান্ডার্ড লাইব্রেরি থেকে ব্যবহার করেছি ।

from pprint import pprint
pprint(read_data('data.txt'))

পেয়ে

{'Animalia': {'Chordata': {'Mammalia': {'Carnivora': {'Canidae': {'Canis': {'Canis': {}}}},
                                        'Primates': {'Hominidae': {'Homo': {'Homo sapiens': {}}}}}}},
 'Plantae': {'nan': {'Magnoliopsida': {'Brassicales': {'Brassicaceae': {'Arabidopsis': {'Arabidopsis thaliana': {}}}},
                                       'Fabales': {'Fabaceae': {'Phaseoulus': {'Phaseolus vulgaris': {}}}}}}}}

আপনার প্রশ্নটি আবার পড়তে, আপনি জোড়গুলির একটি বড় টেবিল ('আরও সাধারণ গ্রুপের লিঙ্ক', 'আরও নির্দিষ্ট গোষ্ঠীর লিঙ্ক') চাইতে পারেন। তা হল, 'এনিমালিয়া' 'এনিমেলিয়া: কর্ডাটা' এবং 'এনিমেলিয়া: কর্ডাটা' এর সাথে 'এনিমেলিয়া: কর্ডাটা: ম্যামালিয়া "এর লিঙ্ক রয়েছে দুর্ভাগ্যক্রমে, আপনার ডেটাতে' নান 'এর অর্থ প্রতিটি লিঙ্কে আপনার পুরো নাম প্রয়োজন If পিতা বা মাতা, সন্তানের) জুড়িগুলি যা আপনি চান, গাছটি এভাবে চলুন:

def walk_children(tree, parent=''):
    for child in tree.keys():
        full_name = parent + ':' + child
        yield (parent, full_name)
        yield from walk_children(tree[child], full_name)

tree = read_data('data.txt')
for (parent, child) in walk_children(tree):
    print(f'parent="{parent}" child="{child}"')

দান:

parent="" child=":Animalia"
parent=":Animalia" child=":Animalia:Chordata"
parent=":Animalia:Chordata" child=":Animalia:Chordata:Mammalia"
parent=":Animalia:Chordata:Mammalia" child=":Animalia:Chordata:Mammalia:Primates"
parent=":Animalia:Chordata:Mammalia:Primates" child=":Animalia:Chordata:Mammalia:Primates:Hominidae"
parent=":Animalia:Chordata:Mammalia:Primates:Hominidae" child=":Animalia:Chordata:Mammalia:Primates:Hominidae:Homo"
parent=":Animalia:Chordata:Mammalia:Primates:Hominidae:Homo" child=":Animalia:Chordata:Mammalia:Primates:Hominidae:Homo:Homo sapiens"
parent=":Animalia:Chordata:Mammalia" child=":Animalia:Chordata:Mammalia:Carnivora"
parent=":Animalia:Chordata:Mammalia:Carnivora" child=":Animalia:Chordata:Mammalia:Carnivora:Canidae"
parent=":Animalia:Chordata:Mammalia:Carnivora:Canidae" child=":Animalia:Chordata:Mammalia:Carnivora:Canidae:Canis"
parent=":Animalia:Chordata:Mammalia:Carnivora:Canidae:Canis" child=":Animalia:Chordata:Mammalia:Carnivora:Canidae:Canis:Canis"
parent="" child=":Plantae"
parent=":Plantae" child=":Plantae:nan"
parent=":Plantae:nan" child=":Plantae:nan:Magnoliopsida"
parent=":Plantae:nan:Magnoliopsida" child=":Plantae:nan:Magnoliopsida:Brassicales"
parent=":Plantae:nan:Magnoliopsida:Brassicales" child=":Plantae:nan:Magnoliopsida:Brassicales:Brassicaceae"
parent=":Plantae:nan:Magnoliopsida:Brassicales:Brassicaceae" child=":Plantae:nan:Magnoliopsida:Brassicales:Brassicaceae:Arabidopsis"
parent=":Plantae:nan:Magnoliopsida:Brassicales:Brassicaceae:Arabidopsis" child=":Plantae:nan:Magnoliopsida:Brassicales:Brassicaceae:Arabidopsis:Arabidopsis thaliana"
parent=":Plantae:nan:Magnoliopsida" child=":Plantae:nan:Magnoliopsida:Fabales"
parent=":Plantae:nan:Magnoliopsida:Fabales" child=":Plantae:nan:Magnoliopsida:Fabales:Fabaceae"
parent=":Plantae:nan:Magnoliopsida:Fabales:Fabaceae" child=":Plantae:nan:Magnoliopsida:Fabales:Fabaceae:Phaseoulus"
parent=":Plantae:nan:Magnoliopsida:Fabales:Fabaceae:Phaseoulus" child=":Plantae:nan:Magnoliopsida:Fabales:Fabaceae:Phaseoulus:Phaseolus vulgaris"

এটি কোনও নেস্টেড ডিকটি দিয়ে nameএবং childrenপ্রশ্নের অনুরোধ অনুসারে ফেরত দেয় না ।
ফ্যাবিও ক্যাকামো

না এটা হয় না। যা অনুরোধ করা হয়েছিল তা ছিল "এই জাতীয় কিছু"; আমি ধারণা তথ্য কাঠামো সন্ধান করার চেষ্টা হিসাবে এটি গ্রহণ। চারটি লাইনের অনুশীলন করে কেউ কেবল গাছটি হাঁটার মাধ্যমে একটি কাস্টম কাঠামো তৈরি করতে পারে।
চার্লস মেরিয়ামিয়াম

3

পাইথনে, গাছের এনকোড করার একটি উপায় হ'ল একটি ব্যবহার করা dict, যেখানে কীগুলি নোডগুলি উপস্থাপন করে এবং যুক্ত মান হ'ল নোডের পিতামাতার:

{'Homo sapiens': 'Homo',
 'Canis': 'Canidae',
 'Arabidopsis thaliana': 'Arabidopsis',
 'Phaseolus vulgaris': 'Phaseoulus',
 'Homo': 'Hominidae',
 'Arabidopsis': 'Brassicaceae',
 'Phaseoulus': 'Fabaceae',
 'Hominidae': 'Primates',
 'Canidae': 'Carnivora',
 'Brassicaceae': 'Brassicales',
 'Fabaceae': 'Fabales',
 'Primates': 'Mammalia',
 'Carnivora': 'Mammalia',
 'Brassicales': 'Magnoliopsida',
 'Fabales': 'Magnoliopsida',
 'Mammalia': 'Chordata',
 'Magnoliopsida': 'nan',
 'Chordata': 'Animalia',
 'nan': 'Plantae',
 'Animalia': None,
 'Plantae': None}

এর একটি সুবিধা হ'ল আপনি নিশ্চিত করেছেন যে নোডগুলি অনন্য, কারণ dictsনকল কী থাকতে পারে না।

আপনি যদি এর পরিবর্তে আরও সাধারণ নির্দেশিত গ্রাফটি এনকোড করতে চান (যেমন, নোডের একাধিক পিতামাতার থাকতে পারে), আপনি মানগুলির জন্য তালিকা ব্যবহার করতে পারেন এবং বাচ্চাদের (বা পিতামাতার, আমার ধারণা) থাকতে পারে:

{'Homo': ['Homo sapiens', 'ManBearPig'],
'Ursus': ['Ursus arctos', 'ManBearPig'],
'Sus': ['ManBearPig']}

আপনি জেএস-তে অবজেক্টগুলির সাথে অনুরূপ কিছু করতে পারেন, প্রয়োজনে তালিকার জন্য অ্যারে স্থাপন করুন।

এখানে পাইথন কোডটি আমি উপরে প্রথম ডিক তৈরি করতে ব্যবহার করেছি:

import csv

ROWS = []
# Load file: tbl.csv
with open('tbl.csv', 'r') as in_file:
    csvreader = csv.reader(in_file)

    # Ignore leading row numbers
    ROWS = [row[1:] for row in csvreader]
    # Drop header row
    del ROWS[0]

# Build dict
mytree = {row[i]: row[i-1] for row in ROWS for i in range(len(row)-1, 0, -1)}
# Add top-level nodes
mytree = {**mytree, **{row[0]: None for row in ROWS}}

2

আপনার ডেটাটিকে শ্রেণিবিন্যাসে পরিণত করার সম্ভবত সবচেয়ে সহজ উপায়টি ডি 3 এর অন্তর্নির্মিত নেস্টিং অপারেটরটি ব্যবহার করছে d3.nest():

নেস্টিং অ্যারেতে থাকা উপাদানগুলিকে একটি শ্রেণিবিন্যাসের গাছের কাঠামোর মধ্যে বিভক্ত করতে দেয়;

মূল ফাংশনগুলির মাধ্যমে নিবন্ধন করে nest.key()আপনি সহজেই আপনার শ্রেণিবিন্যাসের কাঠামো নির্দিষ্ট করতে পারেন। অনেকটা জেরার্ডো তার উত্তরে যেমন লিখেছিলেন আপনি .columnsএই মূল ফাংশনগুলি উত্পন্ন করতে স্বয়ংক্রিয়ভাবে আপনার সিএসভি পার্স করার পরে ডেটা অ্যারেতে প্রকাশিত সম্পত্তিটি ব্যবহার করতে পারেন । পুরো কোডটি নীচের লাইনে ফোটে:

const nester = d3.nest();                             // Create a nest operator
const [, ...taxonomicRanks] = data.columns;           // Get rid of the RecordID property
taxonomicRanks.forEach(r => nester.key(d => d[r]));   // Register key functions
const nest = nester.entries(data);                    // Calculate hierarchy

তবে নোট করুন, ফলস্বরূপ শ্রেণিবদ্ধতা আপনার প্রশ্নে অনুরোধ করা কাঠামোর সাথে ঠিক একইভাবে মেলে না কারণ পদগুলির { key, values }পরিবর্তে বস্তুগুলি রয়েছে { name, children }; যাইহোক, এটি একইভাবে জেরার্ডোর উত্তরের জন্য সত্য। এটি উভয় জবাবের জন্য ক্ষতি করে না, যদিও বাচ্চাদের অ্যাকসেসর ফাংশন d3.hierarchy()নির্দিষ্ট করে ফলাফলগুলি বঞ্চিত করা যায় :

d3.hierarchy(nest, d => d.values)   // Second argument is the children accessor

নিম্নলিখিত ডেমো সমস্ত অংশ একসাথে রাখে:

আপনি d3.nest () কী এবং আপনার নিজের পোস্টের কাঠামোটি ঠিকঠাক গঠনের প্রয়োজন বোধ করলে ক্ষেত্রে নাম এবং শিশুদের রূপান্তরকে মূল্যবান করে তুলতে পারেন।


d3.nestএটি স্থায়ী হওয়ার সময় উপভোগ করুন : এটি শীঘ্রই হ্রাস করা হবে।
জেরার্ডো ফুর্তাদো

এই টুইটটি আমার নিজের প্রথম চিন্তা ছিল era তবে, এই অনুমানটিকে সমর্থন করে কোনও রেফারেন্স পাইনি। আমি ভেবেছিলাম আমি এটি অপসারণ সম্পর্কে পড়েছি এবং এমনকি এটি বান্ডিলটিতে থাকা সন্ধান করেও অবাক হয়েছি। d3-সংগ্রহ সংরক্ষণাগারভুক্ত করা হয়েছে, তবুও এটিতে কোনও হ্রাসমূলক নোট নেই। এই বিষয়ে আপনার কাছে কোনও নির্ভরযোগ্য তথ্য আছে?
altocumulus

এটি ভি 6 এর জন্য, এখানে দেখুন । তাকান "D3 সংগ্রহ [সরানো হয়েছে!]"
জেরার্ডো ফুর্তাদাদো

@ জেরার্ডোফুর্তাদো নো, এটি আমার মনে রাখা রেফারেন্স ছিল না। তবুও, এটি আমার প্রশ্নের উত্তর দেয়, দুঃখের সাথে।
altocumulus

1

একটি মজার চ্যালেঞ্জ। এই জাভাস্ক্রিপ্ট কোড ব্যবহার করে দেখুন। আমি সরলতার জন্য লোডাসের সেটটি ব্যবহার করি।

import { set } from 'lodash'

const csvString = `RecordID,kingdom,phylum,class,order,family,genus,species
    1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
    2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis
    3,Plantae,nan,Magnoliopsida,Brassicales,Brassicaceae,Arabidopsis,Arabidopsis thaliana
    4,Plantae,nan,Magnoliopsida,Fabales,Fabaceae,Phaseoulus,Phaseolus vulgaris`

// First create a quick lookup map
const result = csvString
  .split('\n') // Split for Rows
  .slice(1) // Remove headers
  .reduce((acc, row) => {
    const path = row
      .split(',') // Split for columns
      .filter(item => item !== 'nan') // OPTIONAL: Filter 'nan'
      .slice(1) // Remove record id
    const species = path.pop() // Pull out species (last entry)
    set(acc, path, species)
    return acc
  }, {})

console.log(JSON.stringify(result, null, 2))

// Then convert to the name-children structure by recursively calling this function
const convert = (obj) => {
  // If we're at the end of our chain, end the chain (children is empty)
  if (typeof obj === 'string') {
    return [{
      name: obj,
      children: [],
    }]
  }
  // Else loop through each entry and add them as children
  return Object.entries(obj)
    .reduce((acc, [key, value]) => acc.concat({
      name: key,
      children: convert(value), // Recursive call
    }), [])
}

const result2 = convert(result)

console.log(JSON.stringify(result2, null, 2))

এটি আপনি যা চান চূড়ান্ত ফলাফল (অনুরূপ) উত্পাদন করে।

[
  {
    "name": "Animalia",
    "children": [
      {
        "name": "Chordata",
        "children": [
          {
            "name": "Mammalia",
            "children": [
              {
                "name": "Primates",
                "children": [
                  {
                    "name": "Hominidae",
                    "children": [
                      {
                        "name": "Homo",
                        "children": [
                          {
                            "name": "Homo sapiens",
                            "children": []
                          }
                        ]
                      }
                    ]
                  }
                ]
              },
              {
                "name": "Carnivora",
                "children": [
                  {
                    "name": "Canidae",
                    "children": [
                      {
                        "name": "Canis",
                        "children": [
                          {
                            "name": "Canis",
                            "children": []
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "name": "Plantae",
    "children": [
      {
        "name": "Magnoliopsida",
        "children": [
          {
            "name": "Brassicales",
            "children": [
              {
                "name": "Brassicaceae",
                "children": [
                  {
                    "name": "Arabidopsis",
                    "children": [
                      {
                        "name": "Arabidopsis thaliana",
                        "children": []
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "name": "Fabales",
            "children": [
              {
                "name": "Fabaceae",
                "children": [
                  {
                    "name": "Phaseoulus",
                    "children": [
                      {
                        "name": "Phaseolus vulgaris",
                        "children": []
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

1

আসলে, @ চারেলস মেরিয়াম তার সমাধানটি খুব মার্জিত।

আপনি যদি প্রশ্নের মতোই কোনও ফলাফল করতে চান তবে নীচের মত চেষ্টা করুন।

from io import StringIO
import csv


CSV_CONTENTS = """RecordID,kingdom,phylum,class,order,family,genus,species
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis
3,Plantae,nan,Magnoliopsida,Brassicales,Brassicaceae,Arabidopsis,Arabidopsis thaliana
4,Plantae,nan,Magnoliopsida,Fabales,Fabaceae,Phaseoulus,Phaseolus vulgaris
"""


def recursive(dict_data):
    lst = []
    for key, val in dict_data.items():
        children = recursive(val)
        lst.append(dict(name=key, children=children))
    return lst


def main():
    with StringIO() as io_f:
        io_f.write(CSV_CONTENTS)
        io_f.seek(0)
        io_f.readline()  # skip the column headers line of the file
        result_tree = {}
        for row_data in csv.reader(io_f):
            cur_dict = result_tree  # cursor, back to root
            for item in row_data[1:]:  # each item, skip the record number
                if item not in cur_dict:
                    cur_dict[item] = {}  # create new dict
                    cur_dict = cur_dict[item]
                else:
                    cur_dict = cur_dict[item]

    # change answer format
    result_list = []
    for cur_kingdom_name in result_tree:
        result_list.append(dict(name=cur_kingdom_name, children=recursive(result_tree[cur_kingdom_name])))

    # Optional
    import json
    from os import startfile
    output_file = 'result.json'
    with open(output_file, 'w') as f:
        json.dump(result_list, f)
    startfile(output_file)


if __name__ == '__main__':
    main()

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.