World: r4wp
[Rebol School] REBOL School
older newer | first last |
Sujoy 3-Jul-2012 [576] | not quite understanding how to use sort with this structure... |
Henrik 3-Jul-2012 [577] | The structure is a little strange. Are you trying to sort the outer hash or the inner hash? |
Sujoy 3-Jul-2012 [578x2] | both actually - need the outer hash sorted based on a property of the object inside the inner hash |
ideally, would like to keep the hash h intact for retrieval by the keys | |
Henrik 3-Jul-2012 [580] | The data you have pasted, contains two identical objects, so am not sure what the outcome is supposed to be. |
Sujoy 3-Jul-2012 [581x3] | here's the hash closer to reality: #[hash!["20Th Century Finance Corpn. Ltd. [Merged]" #[object! [ name: "20Th Century Finance Corpn. Ltd. [Merged]" mcapz: #[hash!["1993-1994" #[object! [ yyyymmdd: 30-Sep-1993 rebal-year: 1993 ln-mcap: 5.07528783998276 mcap: 160.018245 ltmto: 0 ]] "1992-1993" #[object! [ yyyymmdd: 30-Sep-1992 rebal-year: 1992 ln-mcap: 4.64720424566052 mcap: 104.293 ltmto: 0 ]] "1991-1992" #[object! [ yyyymmdd: 27-Sep-1991 rebal-year: 1991 ln-mcap: 3.28196329373846 mcap: 26.628 ltmto: 0 ]] "1996-1997" #[object! [ yyyymmdd: 30-Sep-1996 rebal-year: 1996 ln-mcap: 4.22786241308827 mcap: 68.5705 ltmto: 4.4951 ]] "1995-1996" #[object! [ yyyymmdd: 29-Sep-1995 rebal-year: 1995 ln-mcap: 4.6522555263423 mcap: 104.821146 ltmto: 1.9152 ]] "1994-1995" #[object! [ yyyymmdd: 30-Sep-1994 rebal-year: 1994 ln-mcap: 5.60133608288591 mcap: 270.787961 ltmto: 0 ]] "1999-2000" #[object! [ yyyymmdd: 1-Sep-1999 rebal-year: 1999 ln-mcap: #[none] mcap: #[none] ltmto: 0.3847 ]] "1998-1999" #[object! [ yyyymmdd: 30-Sep-1998 rebal-year: 1998 ln-mcap: 3.26596118430253 mcap: 26.205287 ltmto: 1.8029 ]] "1997-1998" #[object! [ yyyymmdd: 30-Sep-1997 rebal-year: 1997 ln-mcap: 3.70636432395486 mcap: 40.705545 ltmto: 4.0871 ]]]] ]] "3M India Ltd." #[object! [ name: "3M India Ltd." mcapz: #[hash!["1993-1994" #[object! [ yyyymmdd: 30-Sep-1993 rebal-year: 1993 ln-mcap: 5.2695189287062 mcap: 194.322457 ltmto: 0 ]] "1992-1993" #[object! [ yyyymmdd: 30-Sep-1992 rebal-year: 1992 ln-mcap: 5.16365007188814 mcap: 174.80133 ltmto: 0 ]] "1991-1992" #[object! [ yyyymmdd: 27-Sep-1991 rebal-year: 1991 ln-mcap: 5.13698182480598 mcap: 170.201295 ltmto: 0 ]] "1994-1995" #[object! [ yyyymmdd: 30-Sep-1994 rebal-year: 1994 ln-mcap: 5.67980332582336 mcap: 292.89182 ltmto: 0 ]] "1995-1996" #[object! [ yyyymmdd: 29-Sep-1995 rebal-year: 1995 ln-mcap: 5.36086870986747 mcap: 212.909823 ltmto: 2.438 ]] "1996-1997" #[object! [ yyyymmdd: 27-Sep-1996 rebal-year: 1996 ln-mcap: 5.29527142738166 mcap: 199.391739 ltmto: 13.7717 ]] "1999-2000" #[object! [ yyyymmdd: 30-Sep-1999 rebal-year: 1999 ln-mcap: 6.62266108574718 mcap: 751.943423 ltmto: 70.8157 ]] "1998-1999" #[object! [ yyyymmdd: 30-Sep-1998 rebal-year: 1998 ln-mcap: 5.59892693888198 mcap: 270.136379 ltmto: 12.1941 ]] "1997-1998" #[object! [ yyyymmdd: 30-Sep-1997 rebal-year: 1997 ln-mcap: 5.41116944722567 mcap: 223.893266 ltmto: 10.31 ]] "2002-2003" #[object! [ yyyymmdd: 30-Sep-2002 rebal-year: 2002 ln-mcap: 5.87169433363346 mcap: 354.849705 ltmto: 18.495901 ]] "2001-2002" #[object! [ yyyymmdd: 28-Sep-2001 rebal-year: 2001 ln-mcap: 5.70261800358953 mcap: 299.650862 ltmto: 17.817 ]] "2000-2001" #[object! [ yyyymmdd: 29-Sep-2000 rebal-year: 2000 ln-mcap: 6.51937914011665 mcap: 678.157214 ltmto: 39.9108 ]] "2003-2004" #[object! [ yyyymmdd: 30-Sep-2003 rebal-year: 2003 ln-mcap: 6.14402101757279 mcap: 465.923295 ltmto: 22.518454 ]] "2004-2005" #[object! [ yyyymmdd: 30-Sep-2004 rebal-year: 2004 ln-mcap: 6.36648735824138 mcap: 582.009842 ltmto: 18.47743 ]] "2005-2006" #[object! [ yyyymmdd: 30-Sep-2005 rebal-year: 2005 ln-mcap: 6.89448778574422 mcap: 986.820132 ltmto: 76.96006 ]] "2007-2008" #[object! [ yyyymmdd: 28-Sep-2007 rebal-year: 2007 ln-mcap: 7.61782530207882 mcap: 2034.13369 ltmto: 565.232151 ]] "2006-2007" #[object! [ yyyymmdd: 29-Sep-2006 rebal-year: 2006 ln-mcap: 7.29216005157061 mcap: 1468.739827 ltmto: 326.743221999999 ]] "2008-2009" #[object! [ yyyymmdd: 30-Sep-2008 rebal-year: 2008 ln-mcap: 7.3914506403371 mcap: 1622.057429 ltmto: 244.97382 ]] "2010-2011" #[object! [ yyyymmdd: 30-Sep-2010 rebal-year: 2010 ln-mcap: 8.40720356304076 mcap: 4479.217133 ltmto: 123.100087 ]] "2009-2010" #[object! [ yyyymmdd: 30-Sep-2009 rebal-year: 2009 ln-mcap: 7.58070461394744 mcap: 1960.009529 ltmto: 91.0568390000001 ]] "2011-2012" #[object! [ yyyymmdd: 30-Sep-2011 rebal-year: 2011 ln-mcap: 8.45073201719186 mcap: 4678.496222 ltmto: 282.168385 ]]]] ]] |
i need to sort the hash based on a param (mcap) for an input year (say "1991-1992") | |
then do things like 1. select the top 50% 2. calculate interquartile ranges etc. | |
Henrik 3-Jul-2012 [584] | Why do the brackets not match... |
Sujoy 3-Jul-2012 [585] | apologies again - extracted this fragment from a gzillion mb file - there should be ]]]] at the end |
Henrik 3-Jul-2012 [586] | aha, skipping does work, but the comparison happens on the strings instead of the objects. |
Sujoy 3-Jul-2012 [587x2] | yes... >> sort/skip/compare/all comps 2 func [a b][a > b ] ..sorts in reverse order |
i cant seem to reference the object! | |
Henrik 3-Jul-2012 [589] | is MCAPZ the same as ATTRIBS? |
Sujoy 3-Jul-2012 [590x3] | yes |
if i do: >> sort/skip/compare/all comps 2 func [a b][length? a/mcapz > length? b/mcapz ] i get an invalid path error | |
and what i need to do is more complex than that :( | |
Henrik 3-Jul-2012 [593] | you can do a REVERSE H before and after the sorting. That allows SORT to grab the objects. |
Sujoy 3-Jul-2012 [594x2] | let me try... |
>> reverse comps sort/skip/compare/all comps 2 func [a b][length? a/mcapz > length? b/mcapz ] ** Script Error: Invalid path value: mcapz ** Near: length? a/mcapz > length? b/mcapz | |
Henrik 3-Jul-2012 [596] | Try: func [a b][probe type? a probe type? b length? a/mcapz > length? b/mcapz ] |
Maxim 3-Jul-2012 [597] | when you use /all, you get two BLOCKS. one for each record of length /skip so your function is called like so: sort-func [ "2009-2010" #[object! [ ... ]] ] [ "2011-2012" #[object! [ ... ]] ] |
Henrik 3-Jul-2012 [598] | aha, that means you don't need the REVERSE. You just need to reference the values differently. |
Sujoy 3-Jul-2012 [599] | reverse comps sort/skip/compare/all comps 2 func [a b][probe type? a probe type? b length? a/mcapz > length? b/mcapz ] block! block! ** Script Error: Invalid path value: mcapz ** Near: length? a/mcapz > length? b/mcapz |
Henrik 3-Jul-2012 [600] | Maxim's SORT-FUNC block shows you how to reference the values properly. |
Maxim 3-Jul-2012 [601x2] | my last example above with ?? added shows this clearly: >> sort/skip/compare/all [1 [2 "a"] 0 [4 "z"] 5 [4 "m"]] 2 func [a b][ ?? a ?? b a/2/2 < b/2/2 ] a: [0 [4 "z"]] b: [5 [4 "m"]] a: [1 [2 "a"]] b: [0 [4 "z"]] a: [5 [4 "m"]] b: [1 [2 "a"]] == [1 [2 "a"] 5 [4 "m"] 0 [4 "z"]] what is part of the record is completely irrelevant to sort, it transfers all control to your function. |
the only really problem with a compare func is that you must be sure that your data can be compared (which is not true for all types. ex: true/false is not defined for all comparison ops: >> true > false ** Script Error: Cannot use greater? on logic! value ** Near: true > false | |
Sujoy 3-Jul-2012 [603x2] | am getting somewhere (i think) >> sort/skip/compare/all comps 2 func [a b][o: a/2/mcapz probe o] === make hash! ["2003-2004" make object! [ yyyymmdd: 30-Sep-2003 rebal-year: 2003 ...]] etc |
so it is a referencing problem | |
Maxim 3-Jul-2012 [605] | yep... its the /2/ which is important here <:-) |
Sujoy 3-Jul-2012 [606x5] | just discovered another problem though...not all inner hashes have the same years - so one objects inner hash may have key "1991-1992" while another may not |
looks like i will have to collect the objects/inner-hash-objects into a separate collection, then apply the sorting on the new collection | |
c: copy[] foreach [k v] comps [if select v/mcapz "1991-1992" [append c v]] or some such | |
then use maxim's sort-func on c instead | |
is that generally the right direction? i would have ideally liked to have avoided creating new blocks to conserve memory... | |
Maxim 3-Jul-2012 [611] | you can simply say that when an entry doesn't have a year, it is always larger, so you have them at the end of the list. you could then sort those without a date according to their name. if you want just the list for "1991-1992" yes, that is a good approach... however usually, the fastest way to filter-out lists, is to copy the block (not deep, so its quick) and then use remove-each on the new block... like-so: filtered-data: copy data remove-each [hash mcapz] filtered-data [ not select mcapz "1991-1992"] |
Sujoy 3-Jul-2012 [612x3] | will try with both approaches. thanks for the filtered-data tip maxim - will definitely move to that! |
anyone know which one of these would be the correct one to use? 1. percentile: func[s p /local n][n: round/floor (p * (length? s) + 0.5) return s/(n - 1)] 2. percentile: func[s p /local n][n: round/floor (p * (length? s) + 0.5) return s/(n)] | |
s is a sorted series, p is a decimal from 0.0 to 1.0 | |
Arnold 4-Jul-2012 [615] | Those radio buttons are a real pain in the ... . Somebody please rewrite those and make a radiogroup that makes sense? |
ChristianE 4-Jul-2012 [616x2] | view layout [ radio-line of 'a "Check this out" radio-line of 'a "or this" pad 8 radio-line of 'b "Or Check this out" radio-line of 'b "or this" radio-line of 'b "or that" ] |
What' exactly is your problem with radio buttons, Arnold? | |
Arnold 4-Jul-2012 [618x2] | Well it was quite a problem to get the selected value. I ended up first initialising all /data fields to their respective values beforehand to true for the one on and false for the two unselected ones. After that the fields behaved like you would expect, being true in case the selection was on this button and false if not selected. Radio-line is new to me. |
Something like this cost me only a couple of hours trial and err (mostly err) for there was no proper example to copy and it didn't work out of the box without the initialisations. main: layout [ a: radio on 'things lbl-a: "A" b: radio of 'things lbl-b: "B" etc] a/data: true b/data: false view main | |
Maxim 4-Jul-2012 [620x2] | by default all radio buttons in the same pane switch together, you can just wrap your radio buttons in a panel. |
ex: view layout [ panel [across radio radio radio on] panel [across radio on radio radio] ] | |
Arnold 4-Jul-2012 [622x2] | Stil that was not the problem. I wanted to know what selection was made :) |
In my previous example b/data had a value none in stead of false and I could have two radioselections selected at the same time. | |
Maxim 4-Jul-2012 [624x2] | yeah, well, all I can say is that whenever view or more specifically VID is frustrating, you should just mold the face which is aggravating you, save the code to a file and read it in your favorite syntax highlighted editor. you will learn A LOT about how VID.view works and learn quite a few Reboling techniques too. |
very few people use functions as extensively and as precisely as Carl. many functions have supported types I never even realized... like 'PICK which supports true/false | |
older newer | first last |