คอร์สน่าสนใจประจำเดือนกุมภาพันธ์ 2017

Computer Science by Google

คอร์สสอน Content แสนแชร์ 

วิดีโอสอนหลักพื้นฐานวิชา AI ของ Facebook พร้อมซับไตเติลภาษาไทย

กลุ่ม OpenAI เปิดซอร์ส Universe แพลตฟอร์มฝึกสอน AI เล่นเกมและทำงานกว่า 1,000 แบบ

หนังสือ 5 เล่มประจำปี 2016 แนะนำโดย Bill Gates

Advanced Software Construction in Java

Machine Learning for Trading by Georgia Institute of Technology

FRANK GEHRYTEACHES DESIGN AND ARCHITECTURE – Master Class

GORDON RAMSAY TEACHES COOKING – Master Class

ธุรกิจน่าสนใจประจำเดือนกุมภาพันธ์ 2017

รู้จัก Instacart – ช้อปของชำออนไลน์ การันตีความสดถึงมือในหนึ่งชั่วโมง

Grabr แอพฯ ที่ช่วยคุณทำเงินจากการท่องเที่ยวต่างประเทศ

ว่าด้วยเรื่องก่อตั้งบริษัท เทียบจากความผิดพลาด

องค์กรผิดพลาด องค์กรสำเร็จ
 Co-founder เยอะ เถียงกันวุ่น  Co-founder 1-2 คน เป็นคนตัดสินทิศทาง
ไม่มีการจัดการทีม  มีการจัดการทีม เป็นรูปแบบองค์กร หรือบริษัท
 ไม่มี Angel Investor มี หรือ ไม่มีก็ได้ ถ้าไม่มีก็ต้องมีตังค์**
 ไม่มีเงิน ไม่คำนวนห่าเหวอะไรทั้งนั้น เน้นทำไปเรื่อยๆ ไม่มีกรอบเวลา เน้นหาคนทำฟรี หรือผลัดเงินเดือน มีเงินเพียงพอเลี้ยงตัวเอง+พนักงาน+อยู่รอด >8mon.
 ไม่มีเวลาพอเพื่อล้มเหลว(ลองตลาด) ล้ม=เลิกไปเลย มีเวลาพอสำหรับความล้มเหลว เพื่อสำเร็จ >8mon.
 มีภาระทางบ้าน ไม่มีภาระทางบ้าน ลุยได้เต็มที่
 CEO เน้นดีล ไม่เน้นทำงาน ดีลได้ แต่ต้องมีเลขา หรือ พนักงาน Senior คุมงาน
 CEO ไม่เข้าใจการบริหาร+การตลาด+เทคโนโลยี CEO เข้าใจการบริหาร+การตลาด+เทคโนโลยี
 CEO คิดอะไรใหม่ๆ ได้ ก็โยนๆ งานไป CEO รอพนักงาน Sprint(Focus) แต่ละ Week
 ปรับตัวตามไอเดียที่คิดขึ้นไปเรื่อย ปรับตัวตาม Feedback
 ไม่มีตารางงานชัดเจน ทำงานไปเรื่อยๆ
ให้แต่พนักงานมาทำงานนำเสนอที่ตัวเองไปดีล
มีตารางงานชัดเจน งานใหม่ จ.เช้า พฤหัสคุยกับพนักงาน ส่งงานศุกร์บ่าย +ปล่อยให้พนักงานทำงาน
CEO ไม่มีสกิลการขาย – นำเสนอ  CEO เก่งการขาย – นำเสนอ
  CEO ไม่ออกไปคุยกับลูกค้า CEO เน้นออกไปคุยกับลูกค้า พาพนักงานไปด้วยบ้าง
 ผลิตภัณฑ์ 1 to N เน้นก๊อปมาทำ ไม่มีจุดแข็ง จุดต่าง เน้นจุดแข็ง 0 to 1 แก้ปัญหาลูกค้าจำนวนมากที่ต้องการทำสิ่งหนึ่งให้เสร็จแต่เจอปัญหาใหญ่ เป็นหลัก
 ทุกคน คือ ลูกค้าของเรา ผลิตภัณฑ์เพื่อทุกคน ผลิตภัณฑ์ เพื่อลูกค้าพฤติกรรมเดียวกัน ไม่ใช่ทุกคน
 ฟีเจอร์ คิดต่อยอดจากเดิมให้ครบถ้วน ล้ำๆ เป็นหลัก ฟีเจอร์ คิดจากการช่วยลูกค้าที่ Segment เป็นหลัก
 สร้างชื่อโดยพยายามเข้าหากลุ่มด้านมืด ติดสินบน สร้างชื่อโดยรางวัล การแข่งขัน เพื่อดึงดูดนายทุน คอนเนกชั่น และพนักงานเก่งๆ
 เน้นขยายให้ทุกคนรู้จัก (AARRR เข้ามาก ได้น้อย) เน้นขยายตามฐานลูกค้าที่เรารัก และรักเรา ไปบอกต่อ (AARRR เข้าทีละน้อย แต่ได้มาก แล้วค่อยๆเพิ่ม)
 ประชุมยืดเยื้อ เพราะเถียงกันยาว ประชุมเรียบเร็วง่าย ตามเสียงส่วนใหญ่, CEO ตัดสินใจ
 ไม่มีฝ่าย/ช่องทาง Support ลูกค้า มีฝ่าย Support (ช่วงแรกอาจใช้ Marketing หรือ นักแปล =เลขา=Support)
 ไม่มีตัวชี้วัด มีตัวชี้วัด=สร้างมาเหมือน Test case ตั้งแต่แรกก่อตั้ง
 ไม่ยอมจ้างคนเพิ่ม หรือไม่จ้างทำงานอื่นที่พนักไม่สามารถทำได้ คือให้พนักงานทำทุกอย่าง จ้าง Dev, SA&Testor(Manager), Designer เพิ่ม งานด้านอื่นที่ทำไม่ได้ก็ต้องจ้าง เพื่อความมืออาชีพ
 พูดคุยส่วนตัวกับพนักงานบางคน เรื่องโปรเจคคิดออก พูดคุยส่วนตัวกับพนักงานทุกคน เรื่องปรับปรุงองค์กร ส่วนโปรเจคใหม่จะโฟกัสคล้ายเดิม และคุยกับทุกคน
ไม่มี wow ให้พนักงาน = ไม่มี wow ให้ลูกค้า มีสวัสดิการให้พนักงาน = มีสวัสดิการให้ลูกค้า
ในทีมมีแต่นักวิเคราะห์ ไม่มีนักปฏิบัติ ในทีมไม่มีนักวิเคราะห์ธุรกิจ มีแต่นักปฏิบัติ นักวิเคราะห์คือเจ้าของกันเอง และพนักงานจะช่วยคิดเฉพาะงานที่เกี่ยวข้องเชี่ยวชาญ
องค์กรมีแต่พวกพ้อง องค์กรมีความหลากหลาย ด้านวัฒนธรรม
พนักงานไม่มีคนคุมงาน พนักงานมี Senior เก่งๆ คุมงาน
พนักงานทำงานไปเรื่อย แยกกันทำ ไม่มาเจอกัน หรือไม่มีระบบ หรือไม่ช่วยเหลือกัน พนักงานมี Objective ประเมินได้ในเชิงคุณภาพและปริมาณ มีการตามงานกันตลอด ทำงานด้วยกันตลอด มีการบอกสถานะการทำงาน week ก่อน, เมื่อวาน, เมื่อเช้า และตอนนี้ ทำให้ช่วยเหลือกันได้
MVP หรือ Product ส่วน Front-End (สิ่งที่ลูกค้ามองเห็น หรือจับต้องได้) จะดูกากๆ เพราะเน้น MVP ไง๊ MVP หรือ Product ส่วน Front-End จะต้อง Perfect ที่สุด การทำ MVP จะทำที่หลังบ้าน
Code เน้นเข้าใจคนเดียว ทำงานคนเดียว ไม่มี Document หรือ Flow มีแต่ Parameter ไม่บอก Enviroment หรือ Database Code เน้นเข้าใจทุกคน อ่านเข้าใจ ทำได้ทุกคน มี Document, Flow ของระบบ เพื่ออะไร ประกอบด้วยอะไร มี Environment อะไร, ฐานข้อมูลมีอะไร

ลิงค์น่าสนใจประจำเดือนมกราคม 2017

ลิงค์ประกอบไปด้วย

  1.  ด้าน IT, Technology & Innovation
  2. ด้าน Business
  3.  ด้าน Investment
  4.  ด้าน Design
  5.  ด้าน IT, Technology & Innovation
  6.  ด้าน Thinking
  7.  ด้าน News

10 นิสัย ที่เรียนรู้จากเหล่า Startup ที่เติบโตเร็วที่สุดในโลก !! [มีคลิป]

มารู้จัก Android Things Os ใหม่ ที่ไม่ใหม่หมดจดจาก Google ตอนที่ 1

ไม่ไกลเกินฝัน! จากเด็กชอบคอมพ์ สู่วิศวกรพัฒนาซอฟต์แวร์ของ Google

ทำการสร้าง Intelligence Mobile app ?

[Android Code] ทำไมจึงไม่ควรเก็บข้อมูลทิ้งไว้ใน Singleton หรือ Static Variable

Hyper Loop รถไฟความเร็วสูง สำหรับประเทศไทย 4.0 [#3] ระบบสูญญากาศ

ระบบ AI ของ Facebook “เห็น” อะไรในภาพของเรา? Extension บน Chrome ตัวนี้บอกได้

แชร์แท็กซี่ช่วยแก้รถติดได้

สมองมนุษย์วิวัฒนาการจนมีขนาดใหญ่ขึ้น เพราะการกลายพันธุ์เฉพาะจุดในยีน

Building Jarvis

สรุปว่า Facebook เป็นบริษัทเทคโนโลยี หรือเป็นบริษัทสื่อ กันแน่?

4 Innovative Mobile Apps That Will Make Your Business Processes More Efficient

5 Mobile Apps Every Entrepreneur Should Use

 

ลิงค์น่าสนใจประจำเดือนกุมภาพันธ์ 2017

UX Infused — สร้างองค์กรแนวหน้า ผ่านแนวคิด UX Design

ลิงค์ประกอบไปด้วย

  1.  ด้าน IT, Technology & Innovation
  2. ด้าน Business
  3.  ด้าน Investment
  4.  ด้าน Design
  5.  ด้าน IT, Technology & Innovation
  6.  ด้าน Thinking
  7.  ด้าน News

ด้าน IT, Technology & Innovation

มาสร้างไฟล์ Cascade ไว้ใช้ตรวจจับวัตถุกัน

วิธีทำตรวจสอบ Fingle Print ในแอป

[Code Refactoring#1] หยุดใช้ Model Callbacks ซะ! ถ้าไม่อยากปวดตับ

[Code Refactoring#2] จงหลีกเลี่ยงการใช้ Monkey Patch!

[Android Dev Tips] เมื่อ Google Play บังคับให้นักพัฒนาต้องใส่ Privacy Policy เมื่อเข้าถึงความเป็นส่วนตัวของผู้ใช้

ระบบ LINE BOT (API) ตอนที่ #1

ทำแชทบอทง่าย ๆ แบบไม่ต้องโค้ด!!

View story at Medium.com

View story at Medium.com

View story at Medium.com

มาดู k-Nearest Neighbors เทคนิคที่ทำให้เราบอกประเภทข้อมูลของสิ่งที่เราไม่รู้โดยอาศัยข้อมูลที่จัดประเภทแล้วชุดหนึ่ง

Explainer: Machine learning vs AI

สไลด์การบรรยายในงาน Big Data Analytics Tokyo 2017

DEEP LEARNING IBM

RxJava part 1: RxJava คืออะไร แล้วจะตื่นเต้นกันทำไม

ทำงานกับ Google ถ้าเข้าตา Google Kickstart Coding Cup

Deep Learning foundations – udacity

async/await เรามารู้จัก syntax ที่จะมาเปลี่ยนโลกของ javascript กัน

บทความนี้ดีครับ เห็นด้วยหลายอย่างเหมือนกัน (แต่ผมไม่คิดว่าพวกนี้จะมาปีหน้านะ 55)
UX designer จะไม่ใช่แค่ออกแบบเพื่อมือถือและเว็บไซต์อีกแล้ว แต่จะต้องออกแบบประสบการณ์ทั้งหมดของผู้ใช้ ตั้งแต่นาฬิกา ไปจนถึง interaction ในโลก VR
Screen interface (พวกปุ่ม, เมนู) ทั้งหลาย ก็คงยังมีอยู่ แต่โลกเรากำลังเคลื่อนไปในทางที่เราติดต่อกับคอมพิวเตอร์ได้เป็นธรรมชาติมากขึ้น เช่น chat interface (พิมพ์โต้ตอบ) หรือ voice interface (สั่งงานด้วยเสียง เช่น Alexa, Google Home, Siri)
งานของ UX designer จะขยายออกไปทั้งในแนวกว้างและแนวลึก
ความเห็นผม: screen interface ก็คงยังอยู่ครับ แต่พวก elements ต่างๆ บนจอจะไม่ใช่มานิ่งๆ แล้ว มันจะเป็นแนวใช้ AI คิดว่าควรจะแสดงข้อมูลหรือ element อะไรออกมาบนจอ

มอง Test ให้เป็น layer ช่วยเพิ่มคุณภาพให้ Product เราอย่างไร

อธิบายการทำงานของ HTTPS และเทคโนโลยีที่เกี่ยวข้อง แบบพยายามไม่ให้งง

Chief Technology Officer (CTO) กับการสร้าง Thailand 4.0 และ Thai Start-up

ด้าน Business

Metrics และเทคนิคการวิเคราะห์ Facebook Ad เบื้องต้นที่นักการตลาดออนไลน์ควรรู้

Brand Inside นำเสนอเรื่องราว fail story ของ Startup มาอย่างต่อเนื่อง ครั้งนี้เกิดขึ้นที่เกาหลี เป็นบทเรียนที่น่าสนใจถึง Startup ไทยด้วย

คำถามที่น่าสนใจจากนักวิเคราะห์คือ Facebook, Instagram, WhatsApp และ Messenger แตกต่างกันอย่างไร และ Mark Zuckerberg ตอบคำถามนี้ว่าอย่างไร เรื่องนี้ห้ามพลาด

http://techsauce.co/interviews/medical-departures-paul-mactaggart/

DIR4 x BrandAge ร่วมสร้างแหล่งรวมความรู้ทางธุรกิจรูปแบบใหม่

“คนรุ่นใหม่จะประสบความสำเร็จในธุรกิจสตาร์ทอัพจะต้องมี 3 ส่วน คือหนึ่ง ทักษะ คนในทีมต้องมีทักษะด้านเทคโนโลยี เขียนโปรแกรมได้ มีความคิดสร้างสรรค์ และภาษาอังกฤษดี เพื่อช่วยสื่อสารกับนักลงทุนที่ส่วนใหญ่เป็นชาวต่างชาติ สอง ประสบการณ์ สาม แรงจูงใจ ถ้าเป็นเรื่องเงิน โอกาสที่ก็จะทนกับงานก็จะไม่นาน”
ชาล เจริญพันธ์ – Head of Accelerator,DigitalVentures

สรุปหนังสือ : 57 เคล็ดลับสำหรับธุรกิจอาหารเสริมและเครื่องสำอาง

ใน Foundercast 1.5 กับคุณอ้อ พรทิพย์ กองชุน และ การวัดผลการทำงานแบบ OKR

พฤติกรรมของลูกค้าที่เปลี่ยนไป บอกอะไรเราได้บ้าง?

Smart Contract คืออะไร? บริการบน Blockchain ที่ทุกองค์กรต้องทำความรู้จัก

Data Science คืออะไร? ต่างกับ Machine Learning, Data Mining, Data Analysis ยังไง

[ทำ Growth Hacking จากศูนย์] สอนใช้ Funnel วิเคราะห์ธุรกิจของคุณ !!

Pitch Planner : เครื่องมือช่วยคนพูดไม่เก่งให้พรีเซนต์งานได้

ระบบบริการสุขภาพของสวีเดน (Swedish Health Care System) – A Short Introduction

คอร์สสอน Content แสนแชร์ 

วิจัยกรุงศรีชี้บริบทใหม่ระบบสถาบันการเงินยุค 4.0 – 5 Global Megatrend…พลิกโฉมโลก – Thaipublica

30 ไอเดียเจ๋ง ที่นำมาออกแบบสินค้าและบริการ(Service Design)เพื่อแก้ปัญหาให้มนุษย์ได้ตรงจุดสุดๆ

ตอบคำถามคาใจ ถ้ามีบัตรเครดิต แล้วทำไมต้องใช้ PayPal

Metrics และเทคนิคการวิเคราะห์ Facebook Ad เบื้องต้นที่นักการตลาดออนไลน์ควรรู้

 

ด้าน Investment

Trading System Development Course

Mudley Pro League 2017 Rules and Regulations

THE DEBATE OVER POSITION SIZING

อย่าปล่อยให้ตัวเองมีรายได้ทางเดียว!

ด้าน Design

10 หนังที่สร้างเทรนด์แฟชั่น

บุกสตูดิโอ Alex Trochut ศิลปินระดับโลกที่นิวยอร์ก เจาะลึกเบื้องหลังการออกแบบช้าง Limited Edition

สุดยอดภูมิปัญญาของชาวญี่ปุ่นโบราณ ‘สัญญาณกันขโมย’ ในสมัยศตวรรษที่ 15

โลโก้ดีต้องทำงานได้.. ไม่ใช่แค่สวย!

ครั้งแรกในเมืองไทย! ชมผลงานภาพถ่ายของ Sebastião Salgado ช่างภาพสารคดีระดับโลกที่หอศิลป์กรุงเทพฯ

ภาพสตรีทแนะนำวันนี้เป็นงานของ nilesh mazumdar 

Empathy คือ หนึ่งในแกนหลักของ ux (และชีวิตประจำวัน) วีดีโอนี้อธิบายถึงการเป็นผู้ฟังที่ดี แลกเปลี่ยนความคิดเห็นและประสบการณ์ รวมทั้งการเห็นอกเห็นใจและการเอาใจใส่ความรู้สึกคนอื่น 🤠 ดีครับ

รังสรรค์ สถาปนิก

วิธีเปลี่ยนห้องรูหนู ให้เป็นบ้านในฝันแสนน่าอยู่ 4 คลิปวีดีโอสอนจัดห้องที่น่ารักและเข้าใจง่ายมาก ๆ จาก IKEA

http://www.smh.com.au/national/clique/an-interview-with-australian-photojournalist-david-dare-parker-20170214-gucgmd.html

5 เทคนิค ลดความเสี่ยงของฟอร์มกรอกข้อมูลบัตรเครดิต – Omise

ไม่ใช่แค่สวยขึ้น แต่แกร่งขึ้น: เจาะลึกเบื้องหลังการ rebrand ของ Omise

UX Infused — สร้างองค์กรแนวหน้า ผ่านแนวคิด UX Design

 ด้าน Thinking

เจริญสติในที่ทำงาน
อยากสัมภาษณ์ให้เจ๋ง? มาดูกันว่านักสัมภาษณ์ระดับโลก เขาทำกันอย่างไร

4 แบบฝึกหัดที่ช่วยให้ถ่ายภาพเก่งขึ้น

มานิต อุดมคุณธรรม : นักธุรกิจผู้ลงทุนปลูกป่าด้วยความบ้าแต่น่ารัก

เกียรตินิยมมาทำเกษตร

A DAY : MUST READ | ชัชชาติอ่านอะไร

ทำไม ‘สวีเดน’ ถึงเป็นประเทศที่น่าอยู่ขนาดนี้กันนะ?

ทฤษฎี เถื่อนเกมส์ 

ประเทศในอุดมคติ! สวีเดนกับการเป็นที่สุดในทุกด้าน

Investment Talk พ่อภาษี คำเดื่อง 

เงินคงคลังที่หายไปสะท้อนอะไร?

ข้อดีของการระเบิดแก่งแม่น้ำโขง

Let’s Change การศึกษาที่ต้องตามโลกให้ทัน

7 แอปฟรีที่จะทำให้ชีวิตชาวฟรีแลนซ์ง่ายขึ้น

ชีวิตดี๊ดี! 6 วิธีลับสมองให้ดีขึ้น และเปลี่ยนคุณเป็นคนใหม่ที่ดีกว่าเดิม

27 startups in Asia that caught our eye

 

ด้าน News

https://www.mangozero.com/7-sexy-fanpages-you-must-like/

https://www.mangozero.com/setting-to-hide-recent-activity-facebook/

สิงคโปร์กำลังจะขาดแคลนแรงงาน IT อีกถึง 30,000 ตำแหน่งในปี 2017

เมื่อบอสมีคำสั่งให้จัดระเบียบลังกระดาษ เหล่าพนง.จึงสนองตอบออกมาได้อย่างฮา!

Mark Zuckerberg แนะนำผู้ปกครองควรปล่อยให้ลูกเล่นเกมบ้าง

มา Refactor code กัน

Flow การ Code
-> Start with Flowchart
-> Start code with small unit
-> Test drive driven แต่ละ small unit {จะง่ายต่อชีวิตมาก} Refactor code แต่ละ unit
-> Refactor code โดยรวม
-> Test โดยรวม
(แนวคิดการ refactor เบื้องต้น = หมาก็อ่านง่าย, ลดการทำงานของขั้นตอน, ลดสิ่งที่ไม่ได้ใช้ หรือไม่จำเป็นทิ้งไป และ เป็นไปเพื่อทดสอบได้ง่าย)

Basic knowledge
1. หาก Code มีเป้าหมายเพื่อทำอะไรบางแล้วนำผลลัพธ์ไปใช้ต่างกัน ก็ควรแยก Class, ถึงแม้จะ code คล้ายกันก็ตาม (แนวคิดเหมือนกับ method แต่มีเป้าหมายใหญ่กว่า)
2. Method นึง ทำงานอย่างเดียว มีหน้าที่เฉพาะตน เรียกว่า Business Logic
3. Parameter ของ Method ควรมีเท่ากับ Business Logic เท่านั้น -> Test ง่าย+อ่านรู้เรื่อง
4. แต่ละ Class/Method ควรมีผลรวม Code complexity ไม่เกิน 10
_การนับ CC
_4.1 Class/Method ที่ไม่มี condition นับเป็น 1
_4.2 Class/Method ที่มี Condition นับเป็น 2
5. Code ที่เหมือนกันเยอะๆ ไปทำ method หรือ for loop
6. การ Map โดยใช้ Class(ใหญ่) หรือ Hashmap(Key, Value) จะลด variable ได้มหาศาล
7. การตั้งชื่อ varialbe หากอยู่ใน class/ method ให้เป็นตัวพิมพ์เล็ก อยู่นอกเป็นตัวพิมพ์ใหญ่
8. การเรียง code ตามลำดับความสำคัญดังนี้
_8.1 Class ทำอะไร = Main มาก่อน
_8.2 Method อยู่ด้านล่าง Main ที่เรียกใช้
_8.3 หากจะสร้าง local variable เพื่อใช้ ก็ควรอยู่ด้านบนติดกับกลุ่ม Code ที่เรียกใช้มัน
9. การตั้งชื่อ variable หรือ parameter ต้องให้คนอื่นเข้าใจ
10. การ comment code ที่ไม่ได้ช้งานแล้ว ต้อง ‘ลบ’ ออกเท่านั้น ไม่มี comment ใดๆ การ comment จะเป็นการอธิบายวิธีการทำงาน
11. เขียน flowchart การทำงาน
12. Method ที่ใช้ Class เดียว ก็ควรอยู่ใน Class นั้น
13. ค่าที่ถูกใช้ 2 ตัวขึ้นไป ให้สร้าง variable (หากมีการเปลี่ยนแปลงค่าที่เปลี่ยนค่าได้)
14. ค่าที่ถูกใช้ 2 ตัวขึ้นไป หรือ เป็นเลขที่คนอื่นไม่เข้าใจว่ามาได้อย่างไร ต้องบอกว่ามันเป็นค่าอะไร โดย ให้สร้าง CONSTANT (ไม่มีการเปลี่ยนแปลงค่า)

Other Technque:
1. Key ใน Hash map จะไม่ซ้ำ ถ้าอยากเรียงอะไรไม่ซ้ำ หรือเป็น Prime_key ให้มันเป็น Key ซะ
2. การคิดเพื่อ Test: แต่ละ parameter

Example
Before

from collections import defaultdict

import datetime
import luigi
import re
import operator

from sqlalchemy import create_engine, text
from collections import defaultdict
from cons import const

"""
 PROCESS INDICATOR
"""


def higher_high(data_list, day, shift_day):
 if len(data_list) < day + shift_day - 1:
 return 0
 data_spec_days = data_list[shift_day:day + shift_day]
 lower_low_data = min(data_spec_days, key=lambda item: item['low'])
 lower_low_value = lower_low_data['low']
 if lower_low_value == 0.0:
 return 0
 higher_high_data = max(data_spec_days, key=lambda item: item['high'])
 higher_high_value = higher_high_data['high']
 return higher_high_value


def lower_low(data_list, day, shift_day):
 if len(data_list) < day + shift_day - 1:
 return 0
 data_spec_day = data_list[shift_day:day + shift_day]
 lower_low_data = min(data_spec_day, key=lambda item: item['low'])
 lower_low_value = lower_low_data['low']
 return lower_low_value


def process_price_day_ago(data_list, day):
 price_26day_ago = 0.0
 if day <= len(data_list) + 1:
 data = data_list[day]
 price_26day_ago = data['cclose']
 return price_26day_ago


def process_tenkan(hhv9, llv9):
 tenkan_value = 0.0
 tenkan_value = (float(hhv9) + float(llv9)) / 2
 return tenkan_value


def process_kijun(hhv26, llv26):
 kijun_value = 0.0
 kijun_value = (float(hhv26) + float(llv26)) / 2
 return kijun_value


def process_senkou_a(tenkan, kijun):
 senkou_a = 0.0
 senkou_a = (float(tenkan) + float(kijun)) / 2
 return senkou_a


def process_senkou_b(hhv52, llv52):
 senkou_b = (float(hhv52) + float(llv52)) / 2
 return senkou_b


class Ichimoku(luigi.Task):
 date = luigi.DateParameter(default=datetime.date.today())

 def run(self):
 engine = create_engine(const.data_db_host())
 radar_price_above_kijun = 352
 radar_chikou_above_26day_ago = 353
 radar_tenkan_above_kijun = 354
 radar_price_above_cloud = 355
 radar_green_cloud = 356
 radar_chikou_above_cloud = 357
 radar_price_below_kijun = 358
 radar_chikou_below_26day_ago = 359
 radar_tenkan_below_kijun = 360
 radar_price_below_cloud = 361
 radar_red_cloud = 362
 radar_chikou_below_cloud = 363

 engine_web = create_engine(const.web_db())
 symbol_list = engine_web.execute("""
 SELECT
 I_symbol,
 N_symbol
 FROM stockradars.MAP_ID
 JOIN stockgrid.data_all_stock D ON symbol = N_symbol
 WHERE D.[Security Type] = 'S'
 """).fetchall()
 symbol_data = {row['N_symbol']: row['I_symbol'] for row in symbol_list}
 print symbol_data

 fetch_string = """
 SELECT TOP 157
 symbol,
 datadate,
 CAST(high AS float) AS high,
 CAST(cclose AS float) AS cclose,
 CAST(low AS float) AS low
 FROM history
 WHERE symbol = '{symbol}'
 AND datadate <= '{datadate}'
 AND datadate > DATEADD(DAY, -365, '{datadate}')
 AND CAST(cclose AS float) > 0.0
 AND CAST(volume AS float) > 0.0
 ORDER BY datadate DESC;
 """
 radars_list = []
 radars_dictionary = defaultdict(list)

 for symbol, symbol_id in symbol_data.iteritems():
 print symbol_id, symbol
 data_all_list = engine.execute(
 fetch_string.format(symbol=symbol, datadate=self.date.strftime("%Y-%m-%d"))).fetchall()
 if not data_all_list:
 continue

 data = data_all_list[0]
 price = data['cclose']

 hhv9 = higher_high(data_all_list, 9, 0)
 llv9 = lower_low(data_all_list, 9, 0)
 tenkan = process_tenkan(hhv9, llv9)

 hhv26 = higher_high(data_all_list, 26, 0)
 llv26 = lower_low(data_all_list, 26, 0)
 kijun = process_kijun(hhv26, llv26)

 hhv9_shift26 = higher_high(data_all_list, 9, 26)
 llv9_shift26 = lower_low(data_all_list, 9, 26)
 tenkan_shift26 = process_tenkan(hhv9_shift26, llv9_shift26)
 hhv26_shift26 = higher_high(data_all_list, 26, 26)
 llv26_shift26 = lower_low(data_all_list, 26, 26)
 kijun_shift26 = process_tenkan(hhv26_shift26, llv26_shift26)
 senkou_a = process_senkou_a(tenkan_shift26, kijun_shift26)

 hhv52_shift26 = higher_high(data_all_list, 52, 26)
 llv52_shift26 = lower_low(data_all_list, 52, 26)
 senkou_b = process_senkou_b(hhv52_shift26, llv52_shift26)

 price_26day_ago = process_price_day_ago(data_all_list, 26)
 chikou = data['cclose']

 hhv9_shift52 = higher_high(data_all_list, 9, 52)
 llv9_shift52 = lower_low(data_all_list, 9, 52)
 tenkan_shift52 = process_tenkan(hhv9_shift52, llv9_shift52)
 hhv26_shift52 = higher_high(data_all_list, 26, 52)
 llv26_shift52 = lower_low(data_all_list, 26, 52)
 kijun_shift52 = process_tenkan(hhv26_shift52, llv26_shift52)
 senkou_a_52 = process_senkou_a(tenkan_shift52, kijun_shift52)

 hhv52_shift52 = higher_high(data_all_list, 52, 52)
 llv52_shift52 = lower_low(data_all_list, 52, 52)
 senkou_b_52 = process_senkou_b(hhv52_shift52, llv52_shift52)

 try:
 percent_price_kijun = (price - kijun) / kijun * 100
 percent_chikou_price_26day = (chikou - price_26day_ago) / price_26day_ago * 100
 percent_tenkan_kijun = (tenkan - kijun) / kijun * 100
 percent_price_cloud = (price - max(senkou_a, senkou_b)) / max(senkou_a, senkou_b) * 100
 percent_senkou_a_senkou_b = (senkou_a - senkou_b) / senkou_b * 100
 percent_chikou_cloud = (chikou - max(senkou_a_52, senkou_b_52)) / max(senkou_a_52, senkou_b_52) * 100
 except Exception:
 continue

 if price > kijun:
 radars_list += [
 (radar_price_above_kijun, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b, chikou,
 price_26day_ago, percent_price_kijun, percent_chikou_price_26day, percent_tenkan_kijun,
 percent_price_cloud, percent_senkou_a_senkou_b, percent_chikou_cloud)]

 if chikou > price_26day_ago and process_price_day_ago > 0:
 radars_list += [
 (radar_chikou_above_26day_ago, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b,
 chikou, price_26day_ago, percent_price_kijun, percent_chikou_price_26day,
 percent_tenkan_kijun,
 percent_price_cloud, percent_senkou_a_senkou_b, percent_chikou_cloud)]

 if tenkan > kijun:
 radars_list += [
 (radar_tenkan_above_kijun, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b, chikou,
 price_26day_ago, percent_price_kijun, percent_chikou_price_26day, percent_tenkan_kijun,
 percent_price_cloud, percent_senkou_a_senkou_b, percent_chikou_cloud)]

 if (price > senkou_a) or (price > senkou_b):
 radars_list += [
 (radar_price_above_cloud, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b, chikou,
 price_26day_ago, percent_price_kijun, percent_chikou_price_26day, percent_tenkan_kijun,
 percent_price_cloud, percent_senkou_a_senkou_b, percent_chikou_cloud)]

 if senkou_a > senkou_b:
 radars_list += [(radar_green_cloud, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b, chikou,
 price_26day_ago, percent_price_kijun, percent_chikou_price_26day, percent_tenkan_kijun,
 percent_price_cloud, percent_senkou_a_senkou_b, percent_chikou_cloud)]

 if chikou > max(senkou_a_52, senkou_b_52):
 radars_list += [
 (radar_chikou_above_cloud, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b, chikou,
 price_26day_ago, percent_price_kijun, percent_chikou_price_26day, percent_tenkan_kijun,
 percent_price_cloud, percent_senkou_a_senkou_b, percent_chikou_cloud)]

 str_date = self.date.strftime("%Y-%m-%d")
 # print radars_list
 for radars, symbol_id, symbol, price, tenkan, kijun, senkou_a, senkou_b, chikou, price_26, percent_price_kijun, percent_chikou_price_26day, percent_tenkan_kijun, percent_price_senkou_a, percent_senkou_a_senkou_b, percent_chikou_cloud in radars_list:
 if radars == 352:
 radars_dictionary[radars].append((symbol_id, symbol, 352, percent_price_kijun))
 elif radars == 353:
 radars_dictionary[radars].append((symbol_id, symbol, 353, percent_chikou_price_26day))
 elif radars == 354:
 radars_dictionary[radars].append((symbol_id, symbol, 354, percent_tenkan_kijun))
 elif radars == 355:
 radars_dictionary[radars].append((symbol_id, symbol, 355, percent_price_senkou_a))
 elif radars == 356:
 radars_dictionary[radars].append((symbol_id, symbol, 356, percent_senkou_a_senkou_b))
 elif radars == 357:
 radars_dictionary[radars].append((symbol_id, symbol, 357, percent_chikou_cloud))
 sorted(radars_dictionary.items())

 radar_352_symbol = radars_dictionary[radar_price_above_kijun]
 radar_353_symbol = radars_dictionary[radar_chikou_above_26day_ago]
 radar_354_symbol = radars_dictionary[radar_tenkan_above_kijun]
 radar_355_symbol = radars_dictionary[radar_price_above_cloud]
 radar_356_symbol = radars_dictionary[radar_green_cloud]
 radar_357_symbol = radars_dictionary[radar_chikou_above_cloud]

 radar_352_symbol.sort(key=operator.itemgetter(3), reverse=True)
 radar_353_symbol.sort(key=operator.itemgetter(3), reverse=True)
 radar_354_symbol.sort(key=operator.itemgetter(3), reverse=True)
 radar_355_symbol.sort(key=operator.itemgetter(3), reverse=True)
 radar_356_symbol.sort(key=operator.itemgetter(3), reverse=True)
 radar_357_symbol.sort(key=operator.itemgetter(3), reverse=True)

 limit_top = 24
 insert_to_db_str = """
 INSERT INTO stockradars.DAILY_RADARS
 (I_security, D_trade, I_radars, I_order)
 VALUES ({symbol_id}, '{datadate}', {radar_id}, {radar_order})
 """
 # engine.execute(
 #
 # ).fetchall()

 for i in range(len(radar_352_symbol)):
 if i >= limit_top:
 break
 engine_web.execute(insert_to_db_str.format(symbol_id=radar_352_symbol[i][0], datadate=str_date,
 radar_id=radar_352_symbol[i][2],
 radar_order=i + 1))

 for i in range(len(radar_353_symbol)):
 if i >= limit_top:
 break
 engine_web.execute(insert_to_db_str.format(symbol_id=radar_353_symbol[i][0], datadate=str_date,
 radar_id=radar_353_symbol[i][2],
 radar_order=i + 1))

 for i in range(len(radar_354_symbol)):
 if i >= limit_top:
 break
 engine_web.execute(insert_to_db_str.format(symbol_id=radar_354_symbol[i][0], datadate=str_date,
 radar_id=radar_354_symbol[i][2],
 radar_order=i + 1))

 for i in range(len(radar_355_symbol)):
 if i >= limit_top:
 break
 engine_web.execute(insert_to_db_str.format(symbol_id=radar_355_symbol[i][0], datadate=str_date,
 radar_id=radar_355_symbol[i][2],
 radar_order=i + 1))

 for i in range(len(radar_356_symbol)):
 if i >= limit_top:
 break
 engine_web.execute(insert_to_db_str.format(symbol_id=radar_356_symbol[i][0], datadate=str_date,
 radar_id=radar_356_symbol[i][2],
 radar_order=i + 1))

 for i in range(len(radar_357_symbol)):
 if i >= limit_top:
 break
 engine_web.execute(insert_to_db_str.format(symbol_id=radar_357_symbol[i][0], datadate=str_date,
 radar_id=radar_357_symbol[i][2],
 radar_order=i + 1))

 # print " "
 # print "PriceAboveKijun\t\t\t", len(radar_352_symbol), "\t", radar_352_symbol
 # print "ChikouAbove26DaysAgo\t", len(radar_353_symbol), "\t", radar_353_symbol
 # print "TenkanAboveKijun\t\t", len(radar_354_symbol), "\t", radar_354_symbol
 # print "PriceAboveCloud\t\t\t", len(radar_355_symbol), "\t", radar_355_symbol
 # print "GreenCloud\t\t\t\t", len(radar_356_symbol), "\t", radar_356_symbol
 # print "ChikouAboveCloud\t\t", len(radar_357_symbol), "\t", radar_357_symbol


if __name__ == '__main__':
 luigi.run()

After
ปล. if ที่ main code ยังไม่สวยเท่าไหร่นัก

import datetime
import time
import luigi
import operator

from collections import defaultdict
from sqlalchemy import create_engine
from cons import const

"""
 PROCESS ICHIMOKU KINKO HYO RADARS EOD
"""


def higher_high(data_list, day, shift_day):
 if day + 1 + shift_day > len(data_list):
 return 0
 data_spec_days = data_list[shift_day:day + shift_day]
 higher_high_data = max(data_spec_days, key=lambda item: item['high'])
 higher_high_value = higher_high_data['high']
 lower_low_data = min(data_spec_days, key=lambda item: item['low'])
 lower_low_value = lower_low_data['low']
 if lower_low_value == 0:
 return 0
 return higher_high_value


def lower_low(data_list, day, shift_day):
 if day + 1 + shift_day > len(data_list):
 return 0
 data_spec_days = data_list[shift_day:day + shift_day]
 lower_low_data = min(data_spec_days, key=lambda item: item['low'])
 lower_low_value = lower_low_data['low']
 return lower_low_value


def process_day_ago(data_list, day):
 data = data_list[day]
 price_26day_ago = data['datadate']
 return price_26day_ago


def process_price_day_ago(data_list, day):
 if day + 1 <= len(data_list) - 1:
 data = data_list[day]
 price_26day_ago = data['cclose']
 else:
 price_26day_ago = 0.0
 return price_26day_ago


def process_tenkan(data_all_list, shift_previous_day=0):
 hhv9 = higher_high(data_all_list, 9, shift_previous_day)
 llv9 = lower_low(data_all_list, 9, shift_previous_day)
 if hhv9 > 0 and llv9 > 0:
 tenkan_value = (float(hhv9) + float(llv9)) / 2
 else:
 tenkan_value = 0.0
 return tenkan_value


def process_kijun(data_all_list, shift_previous_day=0):
 hhv26 = higher_high(data_all_list, 26, shift_previous_day)
 llv26 = lower_low(data_all_list, 26, shift_previous_day)
 if hhv26 > 0 and llv26 > 0:
 kijun_value = (float(hhv26) + float(llv26)) / 2
 else:
 kijun_value = 0.0
 return kijun_value


def process_senkou_a(data_all_list, shift_previous_day):
 tenkan = process_tenkan(data_all_list, shift_previous_day)
 kijun = process_kijun(data_all_list, shift_previous_day)
 if tenkan > 0 and kijun > 0:
 senkou_a = (float(tenkan) + float(kijun)) / 2
 else:
 senkou_a = 0.0
 return senkou_a


def process_senkou_b(data_all_list, shift_previous_day):
 senkou_b = 0.0
 hhv52 = higher_high(data_all_list, 52, shift_previous_day)
 llv52 = lower_low(data_all_list, 52, shift_previous_day)
 if hhv52 > 0 and llv52 > 0:
 senkou_b = (float(hhv52) + float(llv52)) / 2
 return senkou_b


def percent_price_kijun(price, kijun):
 return abs((price - kijun) / kijun)


def percent_chikou_price_26day(chikou, price_26day_ago):
 return abs((chikou - price_26day_ago) / price_26day_ago)


def percent_tenkan_kijun(tenkan, kijun):
 return abs((tenkan - kijun) / kijun)


def percent_price_cloud(price, senkou_a, senkou_b):
 return abs((price - max(senkou_a, senkou_b)) / max(senkou_a, senkou_b))


def percent_senkoua_senkoub(senkou_a, senkou_b):
 return abs((senkou_a - senkou_b) / senkou_b)


def percent_chikou_cloud(chikou, senkou_a_52, senkou_b_52):
 return abs((chikou - max(senkou_a_52, senkou_b_52)) / max(senkou_a_52, senkou_b_52))


def insert_to_db(engine_web, radar_list, radar_id, datadate):
 insert_str = """
 INSERT INTO stockradars.DAILY_RADARS
 (I_security, D_trade, I_radars, I_order)
 VALUES ({symbol_id}, '{datadate}', {radar_id}, {radar_order})
 """
 i = 0
 for row in radar_list[:24]:
 i += 1
 engine_web.execute(insert_str.format(symbol_id=row['symbol_id'], datadate=datadate,
 radar_id=radar_id,
 radar_order=i))


def radar_is_price_above_kijun(price, kijun):
 return price > kijun


def radar_is_price_below_kijun(price, kijun):
 return price < kijun


def radar_is_chikou_above_price26days(chikou, price_26day_ago):
 return chikou > price_26day_ago > 0


def radar_is_chikou_below_price26days(chikou, price_26day_ago):
 return chikou < price_26day_ago > 0


def radar_is_tenkan_above_kijun(tenkan, kijun):
 return tenkan > kijun


def radar_is_tenkan_below_kijun(tenkan, kijun):
 return tenkan < kijun


def radar_is_price_above_cloud(price, senkou_a, senkou_b):
 return price > max(senkou_a, senkou_b)


def radar_is_price_below_cloud(price, senkou_a, senkou_b):
 return price < min(senkou_a, senkou_b)


def radar_is_green_cloud(senkou_a, senkou_b):
 return senkou_a > senkou_b


def radar_is_red_cloud(senkou_a, senkou_b):
 return senkou_a < senkou_b


def radar_is_chikou_above_cloud(chikou, senkou_a_52, senkou_b_52):
 return chikou > max(senkou_a_52, senkou_b_52)


def radar_is_chikou_below_cloud(chikou, senkou_a_52, senkou_b_52):
 return chikou < min(senkou_a_52, senkou_b_52)


class Ichimoku(luigi.Task):
 date = luigi.DateParameter(default=datetime.date.today())

 def run(self):
 engine = create_engine(const.data_db_host())
 engine_web = create_engine(const.web_db())

 symbol_list = engine_web.execute("""
 SELECT
 I_symbol,
 N_symbol
 FROM stockradars.MAP_ID
 JOIN stockgrid.data_all_stock D ON symbol = N_symbol
 WHERE D.[Security Type] = 'S'
 """).fetchall()
 symbol_data = {row['N_symbol']: row['I_symbol'] for row in symbol_list}

 radar_price_above_kijun = 352
 radar_chikou_above_26day_ago = 353
 radar_tenkan_above_kijun = 354
 radar_price_above_cloud = 355
 radar_green_cloud = 356
 radar_chikou_above_cloud = 357
 radar_price_below_kijun = 358
 radar_chikou_below_26day_ago = 359
 radar_tenkan_below_kijun = 360
 radar_price_below_cloud = 361
 radar_red_cloud = 362
 radar_chikou_below_cloud = 363

 fetch_string = """
 SELECT TOP 105
 symbol,
 datadate,
 CAST(high AS float) AS high,
 CAST(cclose AS float) AS cclose,
 CAST(low AS float) AS low
 FROM history
 WHERE symbol = '{symbol}'
 AND datadate <= '{datadate}'
 AND datadate > DATEADD(DAY, -365, '{datadate}')
 AND CAST(volume AS float) > 0.0
 AND CAST(high AS float) > 0.0
 AND CAST(low AS float) > 0.0
 AND CAST(cclose AS float) > 0.0
 ORDER BY datadate DESC;
 """
 result = defaultdict(list)
 for symbol, symbol_id in symbol_data.iteritems():
 data_all_list = engine.execute(
 fetch_string.format(symbol=symbol, datadate=self.date.strftime("%Y-%m-%d"))).fetchall()
 if not data_all_list:
 continue

 shift_day_26 = 26
 shift_day_52 = 52
 max_day_cal_26 = 27
 max_day_cal_78 = 79
 max_day_cal_104 = 105

 latest = data_all_list[0]
 price = latest['cclose']
 stock = dict()
 stock['symbol_id'] = symbol_id
 stock['symbol'] = symbol
 stock['price'] = price
 stock['chikou'] = price
 stock['tenkan'] = process_tenkan(data_all_list)
 stock['kijun'] = process_kijun(data_all_list)
 stock['chikou'] = price
 stock['price_26day_ago'] = process_price_day_ago(data_all_list, shift_day_26)
 stock['senkou_a'] = process_senkou_a(data_all_list, shift_day_26)
 stock['senkou_b'] = process_senkou_b(data_all_list, shift_day_26)
 stock['senkou_a_52'] = process_senkou_a(data_all_list, shift_day_52)
 stock['senkou_b_52'] = process_senkou_b(data_all_list, shift_day_52)

 if len(data_all_list) >= max_day_cal_26:
 if radar_is_price_above_kijun(stock['price'], stock['kijun']):
 stock[radar_price_above_kijun] = percent_price_kijun(stock['price'], stock['kijun'])
 result[radar_price_above_kijun].append(stock)

 if radar_is_chikou_above_price26days(stock['chikou'], stock['price_26day_ago']):
 stock[radar_chikou_above_26day_ago] = percent_chikou_price_26day(stock['chikou'],
 stock['price_26day_ago'])
 result[radar_chikou_above_26day_ago].append(stock)

 if radar_is_tenkan_above_kijun(stock['tenkan'], ['kijun']):
 stock[radar_chikou_above_26day_ago] = percent_tenkan_kijun(stock['tenkan'], ['kijun'])
 result[radar_tenkan_above_kijun].append(stock)

 if radar_is_price_below_kijun(stock['price'], stock['kijun']):
 stock[radar_price_below_kijun] = percent_price_kijun(stock['price'], stock['kijun'])
 result[radar_price_below_kijun].append(stock)

 if radar_is_chikou_below_price26days(stock['chikou'], stock['price_26day_ago']):
 stock[radar_chikou_below_26day_ago] = percent_chikou_price_26day(stock['chikou'],
 stock['price_26day_ago'])
 result[radar_chikou_below_26day_ago].append(stock)

 if radar_is_tenkan_below_kijun(stock['tenkan'], stock['kijun']):
 stock[radar_tenkan_below_kijun] = percent_tenkan_kijun(stock['tenkan'], stock['kijun'])
 result[radar_tenkan_below_kijun].append(stock)

 if len(data_all_list) >= max_day_cal_78:
 if radar_is_price_above_cloud(stock['price'], stock['senkou_a'], stock['senkou_b']):
 stock[radar_price_above_cloud] = percent_price_cloud(stock['price'], stock['senkou_a'],
 stock['senkou_b'])
 result[radar_price_above_cloud].append(stock)

 if radar_is_green_cloud(stock['senkou_a'], (stock['senkou_b'])):
 stock[radar_green_cloud] = percent_senkoua_senkoub(stock['senkou_a'], stock['senkou_b'])
 result[radar_green_cloud].append(stock)

 if radar_is_price_below_cloud(stock['price'], stock['senkou_a'], stock['senkou_b']):
 stock[radar_price_below_cloud] = percent_price_cloud(stock['price'], stock['senkou_a'],
 stock['senkou_b'])
 result[radar_price_below_cloud].append(stock)

 if radar_is_red_cloud(stock['senkou_a'], stock['senkou_b']):
 stock[radar_red_cloud] = percent_senkoua_senkoub(stock['senkou_a'], stock['senkou_b'])
 result[radar_red_cloud].append(stock)

 if len(data_all_list) >= max_day_cal_104:
 if radar_is_chikou_above_cloud(stock['chikou'], stock['senkou_a_52'], stock['senkou_b_52']):
 stock[radar_chikou_above_cloud] = percent_chikou_cloud(stock['chikou'], stock['senkou_a_52'],
 stock['senkou_b_52'])
 result[radar_chikou_above_cloud].append(stock)

 if radar_is_chikou_below_cloud(stock['chikou'], stock['senkou_a_52'], stock['senkou_b_52']):
 stock[radar_chikou_below_cloud] = percent_chikou_cloud(stock['chikou'], stock['senkou_a_52'],
 stock['senkou_b_52'])
 result[radar_chikou_below_cloud].append(stock)

 str_date = self.date.strftime("%Y-%m-%d")

 for radar_id, value in result.iteritems():
 sorted_list = sorted(value, key=lambda k: k[radar_id], reverse=True)
 print(radar_id, len(sorted_list), sorted_list, " ")
 # insert_to_db(engine_web, sorted_list, radar_id, str_date)

if __name__ == '__main__':
 luigi.run()