# flake8: noqa
import numpy as np
pts = np . array ( [ 3.1261718 , 3.1642578 , 3.0548828 , 3.1125 , 3.190625 , 3.01875 , 2.9816406 , 3.1222656 , 2.9728515 , 2.9826171 , 3.034375 , 3.0392578 , 3.1642578 , 3.0792968 , 3.0011718 , 3.0705078 , 2.9904296 , 3.0089843 , 3.0597656 , 3.0978515 , 2.9210937 , 2.9992187 , 2.9474609 , 2.9621093 , 2.9289062 , 2.89375 , 2.7975585 , 2.9015625 , 2.8175781 , 2.9132812 , 2.8175781 , 2.7501953 , 2.8332031 , 2.8166015 , 2.7638671 , 2.8878906 , 2.7599609 , 2.6999023 , 2.6720703 , 2.6398437 , 2.7243164 , 2.6120117 , 2.6588867 , 2.5558593 , 2.5978515 , 2.5485351 , 2.4269531 , 2.5001953 , 2.4855468 , 2.4367187 , 2.2973144 , 2.2812011 , 2.2890136 , 2.39375 , 2.2836425 , 2.3815429 , 2.2138183 , 2.1964843 , 2.1840332 , 2.1759765 , 2.0421875 , 2.1034667 , 2.0281494 , 2.0880859 , 1.9706542 , 1.9276855 , 1.8522155 , 1.8991821 , 1.7780273 , 1.8180053 , 1.8326843 , 1.8270385 , 1.7182128 , 1.6439941 , 1.5360839 , 1.68385 , 1.4584472 , 1.5955322 , 1.6002929 , 1.4157226 , 1.4704101 , 1.2936523 , 1.2990234 , 1.4281738 , 1.4357421 , 1.409375 , 1.2511718 , 1.2194335 , 1.1554687 , 1.043164 , 1.0954101 , 1.0392578 , 1.0895507 , 1.0880859 , 0.897168 , 0.83369142 , 0.86494142 , 0.87763673 , 0.85322267 , 0.72968751 , 0.57832032 , 0.73066407 , 0.78828126 , 0.69160157 , 0.64375 , 0.5919922 , 0.5529297 , 0.52070314 , 0.60957032 , 0.51093751 , 0.3576172 , 0.49921876 , 0.284375 , 0.21992187 , 0.25214845 , 0.30683595 , 0.30976564 , 0.2716797 , 0.22089843 , 0.25507814 , 0.084179685 , 0.071484372 , 0.1828125 , 0.15644531 , 0.13789062 , 0.054882813 , 0.021679688 , - 0.091601565 , - 0.0203125 , - 0.13359375 , - 0.037890624 , - 0.29765624 , - 0.15605469 , - 0.30351561 , - 0.055468749 , - 0.22148438 , - 0.246875 , - 0.31718749 , - 0.25468749 , - 0.35234374 , - 0.16484375 , - 0.56523436 , - 0.56523436 , - 0.39921874 , - 0.58671874 , - 0.45585936 , - 0.50859374 , - 0.44023436 , - 0.42656249 , - 0.56328124 , - 0.70195311 , - 0.403125 , - 0.76445311 , - 0.98710936 , - 0.7625 , - 0.75273436 , - 0.825 , - 0.996875 , - 0.86210936 , - 0.99492186 , - 0.85625 , - 0.88359374 , - 0.97148436 , - 1.0320313 , - 1.1609375 , - 1.1296875 , - 1.0203125 , - 1.0691407 , - 1.2371094 , - 1.1277344 , - 1.2214844 , - 1.1921875 , - 1.2996094 , - 1.2917969 , - 1.3699219 , - 1.434375 , - 1.3699219 , - 1.3601563 , - 1.5730469 , - 1.3152344 , - 1.4851563 , - 1.48125 , - 1.5925782 , - 1.746875 , - 1.5847657 , - 1.6003907 , - 1.5984375 , - 1.7703125 , - 1.8328125 , - 1.8152344 , - 1.9714844 , - 1.9421875 ] )
stds = np . array ( [ 1.0945262 , 1.156862 , 1.0777057 , 1.1501777 , 1.234844 , 1.0140595 , 1.2004665 , 1.1926303 , 1.1269455 , 1.0362904 , 0.98873031 , 0.88530254 , 1.0078473 , 0.93637651 , 0.90959895 , 0.86409503 , 0.86353016 , 0.74534553 , 0.78025728 , 0.88014913 , 0.75756663 , 0.77129823 , 0.75581717 , 0.79222 , 0.84098673 , 0.79402477 , 0.85648865 , 0.80315614 , 0.77346581 , 0.73097658 , 0.72557795 , 0.72930044 , 0.666103 , 0.77142948 , 0.704379 , 0.6806078 , 0.67680347 , 0.71318036 , 0.72244918 , 0.66123307 , 0.62547487 , 0.67786956 , 0.68404138 , 0.70508122 , 0.62400025 , 0.72325015 , 0.73942852 , 0.67811751 , 0.70370805 , 0.65040058 , 0.6870054 , 0.66093785 , 0.666103 , 0.70040214 , 0.65300173 , 0.69714534 , 0.65825552 , 0.64833081 , 0.6464982 , 0.75850725 , 0.69627059 , 0.71659386 , 0.69307244 , 0.61554217 , 0.62015557 , 0.61998636 , 0.67650336 , 0.68142927 , 0.6278621 , 0.612294 , 0.62592906 , 0.63736153 , 0.74233508 , 0.69297016 , 0.69621509 , 0.67229682 , 0.64879686 , 0.72361159 , 0.70229048 , 0.60928106 , 0.62712252 , 0.66923952 , 0.65802008 , 0.68361813 , 0.61587888 , 0.63348651 , 0.60727841 , 0.64873856 , 0.68847752 , 0.58432156 , 0.61683363 , 0.63311422 , 0.64981711 , 0.57369792 , 0.62604266 , 0.62162364 , 0.62066346 , 0.62808979 , 0.58524042 , 0.63537884 , 0.65367514 , 0.63900274 , 0.61089778 , 0.62513435 , 0.6470505 , 0.63952166 , 0.5937764 , 0.64310449 , 0.64330715 , 0.64322031 , 0.64632386 , 0.60827911 , 0.58887208 , 0.61959165 , 0.70725286 , 0.64287293 , 0.62326396 , 0.65896219 , 0.55610275 , 0.6658656 , 0.65681434 , 0.583188 , 0.6311124 , 0.559652 , 0.71419227 , 0.62490743 , 0.66699386 , 0.62032485 , 0.663036 , 0.61414057 , 0.66179425 , 0.59399503 , 0.65203643 , 0.67839557 , 0.63698763 , 0.617452 , 0.61022842 , 0.7398752 , 0.65657932 , 0.68718743 , 0.67901206 , 0.66126263 , 0.69949967 , 0.70709819 , 0.713336 , 0.68130863 , 0.68652785 , 0.67028236 , 0.7626031 , 0.65259206 , 0.72977453 , 0.66049516 , 0.64261246 , 0.66906089 , 0.69762796 , 0.73719794 , 0.69081914 , 0.69849437 , 0.72435051 , 0.62354708 , 0.68812829 , 0.7193296 , 0.66211933 , 0.69278532 , 0.7518425 , 0.69661695 , 0.672491 , 0.71539241 , 0.7369433 , 0.66120356 , 0.79088491 , 0.77491313 , 0.79442614 , 0.7878198 , 0.78881842 , 0.70690477 , 0.80707121 , 0.78768665 , 0.7215547 , 0.75226194 , 0.72196257 , 0.765799 , 0.77267712 , 0.75844234 , 0.81038833 , 0.81188059 , 0.79864907 , 0.816436 , 0.845298 , 0.85074174 , 0.73668873 , 0.83516812 ] )
order = 3
x = np . arange ( 0 , len ( pts ) )
print ( np . polyfit ( x , pts , order , w = 1 / stds ) )
# Do polyfit manually
w = 1.0 / stds
lhs = np . vander ( x , order + 1 ) . astype ( np . float64 )
rhs = pts
lhs * = np . atleast_2d ( w ) . T
rhs * = w
scale = np . sqrt ( ( lhs * lhs ) . sum ( axis = 0 ) )
lhs = lhs / scale
c , resids , rank , s = np . linalg . lstsq ( lhs , rhs , rcond = None )
c = ( c . T / scale ) . T
print ( c )