ไลบรารี Morpheus ได้รับการออกแบบมาเพื่ออำนวยความสะดวกในการพัฒนาซอฟต์แวร์การวิเคราะห์ประสิทธิภาพสูงที่เกี่ยวข้องกับชุดข้อมูลขนาดใหญ่สำหรับการวิเคราะห์ทั้งแบบออฟไลน์และแบบเรียลไทม์บน Java Virtual Machine (JVM) ไลบรารีนี้เขียนด้วย Java 8 พร้อมการใช้งาน lambdas อย่างกว้างขวาง แต่สามารถเข้าถึงได้สำหรับทุกภาษา JVM
สำหรับเอกสารประกอบโดยละเอียดพร้อมตัวอย่าง โปรดดูที่นี่
ที่แกนหลัก Morpheus มอบโครงสร้างข้อมูลแบบตาราง ที่มีประสิทธิภาพหน่วยความจำ สองมิติอเนกประสงค์ที่เรียกว่า DataFrame
ซึ่งคล้ายกับที่ได้รับความนิยมครั้งแรกใน R ในขณะที่ภาษาคอมพิวเตอร์ทางวิทยาศาสตร์ที่พิมพ์แบบไดนามิกเช่น R, Python และ Matlab นั้นยอดเยี่ยมสำหรับการทำวิจัย แต่ก็ไม่ดีนัก เหมาะสำหรับระบบการผลิตขนาดใหญ่เนื่องจากบำรุงรักษายากมาก และเป็นอันตรายต่อการปรับโครงสร้างใหม่ ไลบรารี Morpheus พยายามที่จะรักษาพลังและความเก่งกาจของแนวคิด DataFrame
ในขณะเดียวกันก็จัดเตรียมชุดอินเทอร์เฟซ ที่ปลอดภัย และ อธิบายตัวเอง ได้มากขึ้น ซึ่งน่าจะทำให้การพัฒนา การบำรุงรักษา และการปรับขนาดความซับซ้อนของโค้ดง่ายขึ้นมาก
ข้อดีอีกประการหนึ่งของไลบรารี Morpheus ก็คือ สามารถ ปรับขนาด บนสถาปัตยกรรมโปรเซสเซอร์แบบมัลติคอร์ได้ดีมาก เนื่องจากมีความสามารถเธรดอันทรงพลังของ Java Virtual Machine การดำเนินการหลายอย่างบน Morpheus DataFrame
สามารถทำงาน แบบขนาน ได้อย่างราบรื่นโดยเพียงแค่เรียก parallel()
บนเอนทิตีที่คุณต้องการดำเนินการ เช่นเดียวกับ Java 8 Streams ภายใน การใช้งานแบบขนานเหล่านี้จะขึ้นอยู่กับเฟรมเวิร์ก Fork & Join และการปรับปรุงประสิทธิภาพที่ใกล้เคียงกันนั้นจะถูกสังเกตสำหรับการดำเนินการบางประเภทเมื่อมีการเพิ่มแกน CPU
Morpheus DataFrame
เป็นโครงสร้างที่จัดเก็บคอลัมน์โดยแต่ละคอลัมน์จะแสดงด้วย Morpheus Array
ซึ่งมีการใช้งานหลายอย่าง รวมถึงเวอร์ชันที่หนาแน่น เบาบาง และแมปหน่วยความจำ อาร์เรย์ Morpheus ได้รับการปรับให้เหมาะสมและเมื่อใดก็ตามที่เป็นไปได้จะได้รับการสนับสนุนโดยอาร์เรย์ Java ดั้งเดิมดั้งเดิม (แม้แต่สำหรับประเภทเช่น LocalDate
, LocalDateTime
ฯลฯ ... ) เนื่องจากสิ่งเหล่านี้มีประสิทธิภาพมากกว่ามากจากมุมมองของพื้นที่จัดเก็บ การเข้าถึง และการรวบรวมขยะ หน่วยความจำที่แมป Morpheus Arrays
ในขณะที่ยังอยู่ในขั้นทดลอง อนุญาตให้สร้าง DataFrames
ขนาดใหญ่มากได้โดยใช้พื้นที่จัดเก็บนอกฮีปที่ได้รับการสนับสนุนโดยไฟล์
แม้ว่าชุดฟีเจอร์ทั้งหมดของ Morpheus DataFrame
ยังคงพัฒนาอยู่ แต่ก็มี API ที่มีประสิทธิภาพมากมายอยู่แล้วที่จะส่งผลต่อการเปลี่ยนแปลงที่ซับซ้อนและการดำเนินการวิเคราะห์ได้อย่างง่ายดาย มีฟังก์ชันมาตรฐานในการคำนวณสถิติสรุป ดำเนินการ Linear Regression ประเภทต่างๆ ใช้ Principal Component Analysis (PCA) และอื่นๆ อีกมากมาย DataFrame
ได้รับการจัดทำดัชนีทั้งในมิติแถวและคอลัมน์ ช่วยให้สามารถ จัดเรียง ข้อมูล แบ่งส่วน จัด กลุ่ม และ รวมข้อมูล ตามแกนใดแกนหนึ่งได้อย่างมีประสิทธิภาพ
Morpheus ยังมุ่งหวังที่จะจัดเตรียมกลไกมาตรฐานในการโหลดชุดข้อมูลจากผู้ให้บริการข้อมูลต่างๆ ความหวังก็คือว่า API นี้จะได้รับการยอมรับจากชุมชนเพื่อเพิ่มแคตตาล็อกของแหล่งข้อมูลที่รองรับ ปัจจุบัน ผู้ให้บริการได้รับการติดตั้งเพื่อให้สามารถโหลดข้อมูลจาก Quandl, Federal Reserve, The World Bank, Yahoo Finance และ Google Finance
พิจารณาชุดข้อมูลคุณลักษณะของยานยนต์ที่เข้าถึงได้ที่นี่ โค้ดด้านล่างโหลดข้อมูล CSV นี้ลงใน Morpheus DataFrame
กรองแถวเพื่อรวมเฉพาะยานพาหนะที่มีอัตราส่วนกำลังต่อน้ำหนัก > 0.1 (โดยที่ น้ำหนัก ถูกแปลงเป็นกิโลกรัม) จากนั้นเพิ่มคอลัมน์เพื่อบันทึกประสิทธิภาพสัมพัทธ์ระหว่างทางหลวงและ ระยะทางในเมือง (MPG) จัดเรียงแถวตามคอลัมน์ที่เพิ่มใหม่นี้จากมากไปน้อย และสุดท้ายจะบันทึกผลลัพธ์ที่แปลงนี้เป็นไฟล์ CSV
DataFrame . read (). csv ( options -> {
options . setResource ( "http://zavtech.com/data/samples/cars93.csv" );
options . setExcludeColumnIndexes ( 0 );
}). rows (). select ( row -> {
double weightKG = row . getDouble ( "Weight" ) * 0.453592d ;
double horsepower = row . getDouble ( "Horsepower" );
return horsepower / weightKG > 0.1d ;
}). cols (). add ( "MPG(Highway/City)" , Double . class , v -> {
double cityMpg = v . row (). getDouble ( "MPG.city" );
double highwayMpg = v . row (). getDouble ( "MPG.highway" );
return highwayMpg / cityMpg ;
}). rows (). sort ( false , "MPG(Highway/City)" ). write (). csv ( options -> {
options . setFile ( "/Users/witdxav/cars93m.csv" );
options . setTitle ( "DataFrame" );
});
ตัวอย่างนี้แสดงให้เห็นถึงลักษณะการทำงานของ Morpheus API โดยที่ประเภทการส่งคืนเมธอดหลายประเภทในความเป็นจริงแล้วเป็น DataFrame
ดังนั้นจึงอนุญาตให้มีการเชื่อมโยงเมธอดรูปแบบนี้ ในตัวอย่างนี้ วิธีการ csv()
, select()
, add()
และ sort()
ล้วนส่งคืนเฟรม ในบางกรณี เฟรมเดียวกับที่วิธีดำเนินการ หรือในกรณีอื่น ๆ มีตัวกรองหรือสำเนาแบบตื้นของเฟรมที่กำลังดำเนินการอยู่ 10 แถวแรกของชุดข้อมูลที่แปลงแล้วในตัวอย่างนี้มีลักษณะดังนี้ โดยมีคอลัมน์ที่เพิ่มใหม่ปรากฏที่ด้านขวาสุดของเฟรม
ดัชนี | ผู้ผลิต | รุ่น | พิมพ์ | ราคาต่ำสุด | ราคา | ราคาสูงสุด | MPG.เมือง | MPG.ทางหลวง | ถุงลมนิรภัย | ไดรฟ์เทรน | กระบอกสูบ | ขนาดเครื่องยนต์ | แรงม้า | รอบต่อนาที | รอบต่อไมล์ | Man.trans.avail | ความจุถังน้ำมัน | ผู้โดยสาร | ความยาว | ระยะฐานล้อ | ความกว้าง | Turn.circle | ที่นั่งด้านหลังห้อง | ห้องสัมภาระ | น้ำหนัก | ต้นกำเนิด | ทำ | MPG(ทางหลวง/เมือง) | - 9 | คาดิลแลค | เดอวิลล์ | ใหญ่ | 33.0000 | 34.7000 | 36.3000 | 16 | 25 | ไดร์เวอร์เท่านั้น | ด้านหน้า | 8 | 4.9000 | 200 | 4100 | 1510 | ไม่ | 18.0000 | 6 | 206 | 114 | 73 | 43 | 35 | 18 | 3620 | สหรัฐอเมริกา | คาดิลแลค เดอวิลล์ | 1.5625 | 10 | คาดิลแลค | เซบียา | ขนาดกลาง | 37.5000 | 40.1000 | 42.7000 | 16 | 25 | คนขับและผู้โดยสาร | ด้านหน้า | 8 | 4.6000 | 295 | 6000 | 1985 | ไม่ | 20.0000 | 5 | 204 | 111 | 74 | 44 | 31 | 14 | 3935 | สหรัฐอเมริกา | คาดิลแลคเซบีญ่า | 1.5625 | 70 | โอลด์สโมบาย | แปดสิบแปด | ใหญ่ | 19.5000 | 20.7000 | 21.9000 | 19 | 28 | ไดร์เวอร์เท่านั้น | ด้านหน้า | 6 | 3.8000 | 170 | 4800 | 1570 | ไม่ | 18.0000 | 6 | 201 | 111 | 74 | 42 | 31.5 | 17 | 3470 | สหรัฐอเมริกา | Oldsmobile แปดสิบแปด | 1.47368421 | 74 | รถปอนเตี๊ยก | ไฟร์เบิร์ด | สปอร์ต | 14.0000 | 17.7000 | 21.4000 | 19 | 28 | คนขับและผู้โดยสาร | ด้านหลัง | 6 | 3.4000 | 160 | 4600 | 1805 | ใช่ | 15.5000 | 4 | 196 | 101 | 75 | 43 | 25 | 13 | 3240 | สหรัฐอเมริกา | รถปอนเตี๊ยกไฟร์เบิร์ด | 1.47368421 | 6 | บูอิค | เลอเซเบอร์ | ใหญ่ | 19.9000 | 20.8000 | 21.7000 | 19 | 28 | ไดร์เวอร์เท่านั้น | ด้านหน้า | 6 | 3.8000 | 170 | 4800 | 1570 | ไม่ | 18.0000 | 6 | 200 | 111 | 74 | 42 | 30.5 | 17 | 3470 | สหรัฐอเมริกา | บูอิค เลอเซเบอร์ | 1.47368421 | 13 | เชฟโรเลต | คามาโร | สปอร์ต | 13.4000 | 15.1000 | 16.8000 | 19 | 28 | คนขับและผู้โดยสาร | ด้านหลัง | 6 | 3.4000 | 160 | 4600 | 1805 | ใช่ | 15.5000 | 4 | 193 | 101 | 74 | 43 | 25 | 13 | 3240 | สหรัฐอเมริกา | เชฟโรเลต คามาโร | 1.47368421 | 76 | รถปอนเตี๊ยก | บอนเนวิลล์ | ใหญ่ | 19.4000 | 24.4000 | 29.4000 | 19 | 28 | คนขับและผู้โดยสาร | ด้านหน้า | 6 | 3.8000 | 170 | 4800 | 1565 | ไม่ | 18.0000 | 6 | 177 | 111 | 74 | 43 | 30.5 | 18 | 3495 | สหรัฐอเมริกา | รถปอนเตี๊ยก บอนเนวิลล์ | 1.47368421 | 56 | มาสด้า | RX-7 | สปอร์ต | 32.5000 | 32.5000 | 32.5000 | 17 | 25 | ไดร์เวอร์เท่านั้น | ด้านหลัง | หมุน | 1.3000 | 255 | 6500 | 2325 | ใช่ | 20.0000 | 2 | 169 | 96 | 69 | 37 | นา | นา | 2895 | ไม่ใช่ประเทศสหรัฐอเมริกา | มาสด้า RX-7 | 1.47058824 | 18 | เชฟโรเลต | เรือลาดตระเวน | สปอร์ต | 34.6000 | 38.0000 | 41.5000 | 17 | 25 | ไดร์เวอร์เท่านั้น | ด้านหลัง | 8 | 5.7000 | 300 | 5000 | 1450 | ใช่ | 20.0000 | 2 | 179 | 96 | 74 | 43 | นา | นา | 3380 | สหรัฐอเมริกา | เชฟโรเลต คอร์เวทท์ | 1.47058824 | 51 | ลินคอล์น | Town_Car | ใหญ่ | 34.4000 | 36.1000 | 37.8000 | 18 | 26 | คนขับและผู้โดยสาร | ด้านหลัง | 8 | 4.6000 | 210 | 4600 | 1840 | ไม่ | 20.0000 | 6 | 219 | 117 | 77 | 45 | 31.5 | 22 | 4055 | สหรัฐอเมริกา | ลินคอล์น ทาวน์_คาร์ | 1.44444444 |
Morpheus API มีอินเทอร์เฟซการถดถอยเพื่อให้ปรับข้อมูลให้พอดีกับโมเดลเชิงเส้นโดยใช้ OLS, WLS หรือ GLS โค้ดด้านล่างใช้ชุดข้อมูลรถยนต์ชุดเดียวกับที่แนะนำในตัวอย่างก่อนหน้านี้ และลด แรงม้า ใน EngineSize ตัวอย่างโค้ดจะพิมพ์ผลลัพธ์ของโมเดลให้เป็นมาตรฐาน ดังที่แสดงด้านล่าง จากนั้นสร้างแผนภูมิกระจายพร้อมเส้นการถดถอยที่แสดงไว้อย่างชัดเจน
//Load the data
DataFrame < Integer , String > data = DataFrame . read (). csv ( options -> {
options . setResource ( "http://zavtech.com/data/samples/cars93.csv" );
options . setExcludeColumnIndexes ( 0 );
});
//Run OLS regression and plot
String regressand = "Horsepower" ;
String regressor = "EngineSize" ;
data . regress (). ols ( regressand , regressor , true , model -> {
System . out . println ( model );
DataFrame < Integer , String > xy = data . cols (). select ( regressand , regressor );
Chart . create (). withScatterPlot ( xy , false , regressor , chart -> {
chart . title (). withText ( regressand + " regressed on " + regressor );
chart . subtitle (). withText ( "Single Variable Linear Regression" );
chart . plot (). style ( regressand ). withColor ( Color . RED ). withPointsVisible ( true );
chart . plot (). trend ( regressand ). withColor ( Color . BLACK );
chart . plot (). axes (). domain (). label (). withText ( regressor );
chart . plot (). axes (). domain (). format (). withPattern ( "0.00;-0.00" );
chart . plot (). axes (). range ( 0 ). label (). withText ( regressand );
chart . plot (). axes (). range ( 0 ). format (). withPattern ( "0;-0" );
chart . show ();
});
return Optional . empty ();
});
- ผลลัพธ์การถดถอยเชิงเส้น - รุ่น: OLS R-Squared: 0.5360 การสังเกต: 93 R-Squared (ปรับแล้ว): 0.5309 DF รุ่น: 1 F-สถิติ: 105.1204 DF ตกค้าง: 91 F-สถิติ (ปัญหา): 1.11E-16 ข้อผิดพลาดมาตรฐาน: รันไทม์ 35.8717 (มิลลิวินาที) 52 เดอร์บิน-วัตสัน: 1.9591 - ดัชนี | พารามิเตอร์ | STD_ERROR | T_สถิติ | P_VALUE | CI_LOWER | CI_UPPER | - สกัดกั้น | 45.2195 | 10.3119 | 4.3852 | 3.107E-5 | 24.736 | 65.7029 | ขนาดเครื่องยนต์ | 36.9633 | 3.6052 | 10.2528 | 7.573E-17 | 29.802 | 44.1245 | -
คุณสามารถเข้าถึงบันทึกธุรกรรมอสังหาริมทรัพย์ที่อยู่อาศัยในสหราชอาณาจักรทั้งหมดตั้งแต่ปี 1995 จนถึงปัจจุบันผ่านทางโครงการริเริ่ม Open Data ของรัฐบาลสหราชอาณาจักร ข้อมูลจะแสดงในรูปแบบ CSV และประกอบด้วยคอลัมน์จำนวนมาก รวมถึงข้อมูล เช่น วันที่ทำธุรกรรม ราคาที่ชำระ ที่อยู่ที่มีคุณสมบัติครบถ้วน (รวมถึงรหัสไปรษณีย์) ประเภททรัพย์สิน ประเภทการเช่า และอื่นๆ
ให้เราเริ่มต้นด้วยการเขียนฟังก์ชันเพื่อโหลดไฟล์ CSV เหล่านี้จากบัคเก็ต Amazon S3 และเนื่องจากมีการจัดเก็บไว้หนึ่งไฟล์ต่อปี เราจึงจัดเตรียมฟังก์ชันที่มีการกำหนดพารามิเตอร์ให้สอดคล้องกัน เมื่อพิจารณาจากข้อกำหนดในการวิเคราะห์ของเราแล้ว ไม่จำเป็นต้องโหลดคอลัมน์ทั้งหมดในไฟล์ ดังนั้นด้านล่างนี้เราจึงเลือกอ่านเฉพาะคอลัมน์ที่ดัชนี 1, 2, 4 และ 11 เท่านั้น นอกจากนี้ เนื่องจากไฟล์ไม่มีส่วนหัว เราจะเปลี่ยนชื่อคอลัมน์ให้มีความหมายมากขึ้นเพื่อให้การเข้าถึงในภายหลังชัดเจนขึ้นเล็กน้อย
/**
* Loads UK house price from the Land Registry stored in an Amazon S3 bucket
* Note the data does not have a header, so columns will be named Column-0, Column-1 etc...
* @param year the year for which to load prices
* @return the resulting DataFrame, with some columns renamed
*/
private DataFrame < Integer , String > loadHousePrices ( Year year ) {
String resource = "http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-%s.csv" ;
return DataFrame . read (). csv ( options -> {
options . setResource ( String . format ( resource , year . getValue ()));
options . setHeader ( false );
options . setCharset ( StandardCharsets . UTF_8 );
options . setIncludeColumnIndexes ( 1 , 2 , 4 , 11 );
options . getFormats (). setParser ( "TransactDate" , Parser . ofLocalDate ( "yyyy-MM-dd HH:mm" ));
options . setColumnNameMapping (( colName , colOrdinal ) -> {
switch ( colOrdinal ) {
case 0 : return "PricePaid" ;
case 1 : return "TransactDate" ;
case 2 : return "PropertyType" ;
case 3 : return "City" ;
default : return colName ;
}
});
});
}
ด้านล่างนี้ เราใช้ข้อมูลนี้เพื่อคำนวณราคาเฉลี่ยเฉลี่ยของอพาร์ทเมนต์ (ไม่ปรับอัตราเงินเฟ้อ) ของอ พาร์ทเมนต์ ในแต่ละปีระหว่างปี 1995 ถึง 2014 สำหรับเมืองย่อยที่ใหญ่ที่สุดในสหราชอาณาจักร มีประมาณ 20 ล้านบันทึกในชุดข้อมูลที่ไม่มีการกรองระหว่างปี 1993 ถึง 2014 และแม้ว่าจะใช้เวลานานพอสมควรในการโหลดและแยกวิเคราะห์ (ข้อมูลประมาณ 3.5GB) Morpheus ดำเนินการส่วนวิเคราะห์ของโค้ดในเวลาประมาณ 5 วินาที (ไม่รวม เวลาโหลด) บน Apple Macbook Pro มาตรฐานที่ซื้อในช่วงปลายปี 2013 โปรดสังเกตว่าเราใช้การประมวลผลแบบขนานเพื่อโหลดและประมวลผลข้อมูลโดยการเรียกอย่างไร results.rows().keys().parallel()
//Create a data frame to capture the median prices of Apartments in the UK'a largest cities
DataFrame < Year , String > results = DataFrame . ofDoubles (
Range . of ( 1995 , 2015 ). map ( Year :: of ),
Array . of ( "LONDON" , "BIRMINGHAM" , "SHEFFIELD" , "LEEDS" , "LIVERPOOL" , "MANCHESTER" )
);
//Process yearly data in parallel to leverage all CPU cores
results . rows (). keys (). parallel (). forEach ( year -> {
System . out . printf ( "Loading UK house prices for %s... n " , year );
DataFrame < Integer , String > prices = loadHousePrices ( year );
prices . rows (). select ( row -> {
//Filter rows to include only apartments in the relevant cities
final String propType = row . getValue ( "PropertyType" );
final String city = row . getValue ( "City" );
final String cityUpperCase = city != null ? city . toUpperCase () : null ;
return propType != null && propType . equals ( "F" ) && results . cols (). contains ( cityUpperCase );
}). rows (). groupBy ( "City" ). forEach ( 0 , ( groupKey , group ) -> {
//Group row filtered frame so we can compute median prices in selected cities
final String city = groupKey . item ( 0 );
final double priceStat = group . colAt ( "PricePaid" ). stats (). median ();
results . data (). setDouble ( year , city , priceStat );
});
});
//Map row keys to LocalDates, and map values to be percentage changes from start date
final DataFrame < LocalDate , String > plotFrame = results . mapToDoubles ( v -> {
final double firstValue = v . col (). getDouble ( 0 );
final double currentValue = v . getDouble ();
return ( currentValue / firstValue - 1d ) * 100d ;
}). rows (). mapKeys ( row -> {
final Year year = row . key ();
return LocalDate . of ( year . getValue (), 12 , 31 );
});
//Create a plot, and display it
Chart . create (). withLinePlot ( plotFrame , chart -> {
chart . title (). withText ( "Median Nominal House Price Changes" );
chart . title (). withFont ( new Font ( "Arial" , Font . BOLD , 14 ));
chart . subtitle (). withText ( "Date Range: 1995 - 2014" );
chart . plot (). axes (). domain (). label (). withText ( "Year" );
chart . plot (). axes (). range ( 0 ). label (). withText ( "Percent Change from 1995" );
chart . plot (). axes (). range ( 0 ). format (). withPattern ( "0.##'%';-0.##'%'" );
chart . plot (). style ( "LONDON" ). withColor ( Color . BLACK );
chart . legend (). on (). bottom ();
chart . show ();
});
เปอร์เซ็นต์การเปลี่ยนแปลงในราคาเฉลี่ยเล็กน้อยสำหรับ อพาร์ทเมนท์ ในเขตย่อยของเมืองที่เลือกแสดงอยู่ในโครงเรื่องด้านล่าง มันแสดงให้เห็นว่าลอนดอนไม่ได้ประสบปัญหาราคาบ้านลดลงเล็กน้อยอันเป็นผลมาจากวิกฤตการเงินโลก (GFC) อย่างไรก็ตาม ไม่ใช่ทุกเมืองในสหราชอาณาจักรที่พิสูจน์แล้วว่าสามารถฟื้นตัวได้ สิ่งที่น่าแปลกใจเล็กน้อยคือเมืองทางตอนเหนือที่ร่ำรวยน้อยกว่าบางแห่งมีอัตราการแข็งค่าที่สูงกว่าในช่วงปี 2546 ถึง 2549 เมื่อเทียบกับลอนดอน สิ่งหนึ่งที่ควรทราบก็คือ แม้ว่าลอนดอนจะไม่เห็นการลดราคาใดๆ ก็ตาม แต่ก็มีการปรับฐานที่ค่อนข้างรุนแรงในแง่ของ EUR และ USD เนื่องจากเงินปอนด์อ่อนค่าลงอย่างมากเมื่อเทียบกับสกุลเงินเหล่านี้ในช่วง GFC
การแสดงข้อมูลเป็นภาพใน Morpheus DataFrames
ทำได้ง่ายผ่าน API การสร้างกราฟแบบธรรมดา พร้อมอะแดปเตอร์ที่รองรับทั้ง JFreeChart และ Google Charts (และยังมีอะแดปเตอร์อื่นๆ ตามมาด้วยความต้องการที่ได้รับความนิยม) การออกแบบนี้ทำให้สามารถสร้างแผนภูมิ Java Swing แบบโต้ตอบได้ตลอดจนแผนภูมิที่ใช้เบราว์เซอร์ HTML5 ผ่านอินเทอร์เฟซแบบโปรแกรมเดียวกัน สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ API นี้ โปรดดูส่วนการแสดงภาพที่นี่ และโค้ดที่นี่
Morpheus ได้รับการเผยแพร่ไปยัง Maven Central ดังนั้นจึงสามารถเพิ่มเป็นการพึ่งพาในเครื่องมือสร้างที่คุณเลือกได้อย่างง่ายดาย ปัจจุบัน Codebase แบ่งออกเป็น 5 Repository เพื่อให้แต่ละโมดูลสามารถพัฒนาได้อย่างอิสระ โมดูลหลักซึ่งมีชื่อเหมาะเจาะว่า morpheus-core เป็นไลบรารีพื้นฐานที่โมดูลอื่นๆ ทั้งหมดต้องพึ่งพา สิ่งประดิษฐ์ Maven ต่างๆ มีดังนี้:
มอร์เฟียส คอร์
ไลบรารีพื้นฐานที่มี Morpheus Arrays, DataFrames และอินเทอร์เฟซและการใช้งานหลักอื่นๆ
< dependency >
< groupId >com.zavtech</ groupId >
< artifactId >morpheus-core</ artifactId >
< version >${VERSION}</ version >
</ dependency >
การแสดงภาพมอร์เฟียส
ส่วนประกอบการแสดงภาพเพื่อแสดง DataFrames
ในแผนภูมิและตาราง
< dependency >
< groupId >com.zavtech</ groupId >
< artifactId >morpheus-viz</ artifactId >
< version >${VERSION}</ version >
</ dependency >
มอร์เฟียส ควอนเดิล
อะแดปเตอร์สำหรับโหลดข้อมูลจาก Quandl
< dependency >
< groupId >com.zavtech</ groupId >
< artifactId >morpheus-quandl</ artifactId >
< version >${VERSION}</ version >
</ dependency >
มอร์เฟียส กูเกิล
อะแดปเตอร์สำหรับโหลดข้อมูลจาก Google Finance
< dependency >
< groupId >com.zavtech</ groupId >
< artifactId >morpheus-google</ artifactId >
< version >${VERSION}</ version >
</ dependency >
มอร์เฟียส ยาฮู
อะแดปเตอร์สำหรับโหลดข้อมูลจาก Yahoo Finance
< dependency >
< groupId >com.zavtech</ groupId >
< artifactId >morpheus-yahoo</ artifactId >
< version >${VERSION}</ version >
</ dependency >
ฟอรัมคำถามและคำตอบได้รับการตั้งค่าโดยใช้ Google Groups และสามารถเข้าถึงได้ที่นี่
Morpheus Javadocs สามารถเข้าถึงได้ทางออนไลน์ที่นี่
คุณสามารถเข้าถึงเซิร์ฟเวอร์การสร้างการรวมอย่างต่อเนื่องได้ที่นี่ ซึ่งจะสร้างโค้ดหลังจากการรวมแต่ละครั้ง
Morpheus เปิดตัวภายใต้ Apache Software Foundation License เวอร์ชัน 2