Skip to content

Commit 905106b

Browse files
committed
functional programming more on stats
1 parent f90d96f commit 905106b

File tree

3 files changed

+130
-2
lines changed

3 files changed

+130
-2
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import math
2+
from collections import Sequence
3+
# from typing import Sequence
4+
5+
6+
def mean(items: Sequence):
7+
return sum(items) / len(items)
8+
9+
10+
def z(x, mu_x: float, rou_x: float) -> float:
11+
return (x - mu_x) / rou_x
12+
13+
14+
if __name__ == '__main__':
15+
data = range(10)
16+
17+
def g():
18+
for i in range(10):
19+
yield i
20+
21+
s0 = sum(x ** 0 for x in g())
22+
s1 = sum(x ** 1 for x in g())
23+
s2 = sum(x ** 2 for x in g())
24+
25+
mean_ = s1 / s0
26+
stdev_ = math.sqrt(s2 / s0 - (s1 / s0) ** 2)
27+
28+
print(mean_, stdev_)
29+
30+
d = [2, 4, 4, 4, 5, 5, 7, 9]
31+
d_s0 = sum(x ** 0 for x in d)
32+
d_s1 = sum(x ** 1 for x in d)
33+
d_s2 = sum(x ** 2 for x in d)
34+
35+
mean_d = d_s1 / d_s0
36+
stdev_d = math.sqrt(d_s2 / d_s0 - (d_s1 / d_s0) ** 2)
37+
38+
print(
39+
list(z(x, mean_d, stdev_d) for x in d)
40+
)
41+
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import math
2+
from collections import Sequence
3+
4+
5+
def s0(samples: Sequence) -> float:
6+
return sum(1 for x in samples)
7+
8+
9+
def s1(samples: Sequence) -> float:
10+
return sum(x for x in samples)
11+
12+
13+
def s2(samples: Sequence) -> float:
14+
return sum(x ** 2 for x in samples)
15+
16+
17+
def mean(samples: Sequence) -> float:
18+
return s1(samples) / s0(samples)
19+
20+
21+
def stdev(samples: Sequence) -> float:
22+
N = s0(samples)
23+
return math.sqrt(s2(samples) / N - (s1(samples) / N) ** 2)
24+
25+
26+
def z(x, mu_x: float, rou_x: float) -> float:
27+
return (x - mu_x) / rou_x
28+
29+
30+
def corr(samples1: Sequence, samples2: Sequence) -> float:
31+
m_1, s_1 = mean(samples1), stdev(samples1)
32+
m_2, s_2 = mean(samples2), stdev(samples2)
33+
34+
z_1 = (z(x, m_1, s_1) for x in samples1)
35+
z_2 = (z(x, m_2, s_2) for x in samples2)
36+
37+
r = (sum(zx1 * zx2 for zx1, zx2 in zip(z_1, z_2))) / len(samples1)
38+
return r
39+
40+
41+
if __name__ == '__main__':
42+
d = [2, 4, 4, 4, 5, 5, 7, 9]
43+
print(
44+
list(z(x, mean(d), stdev(d)) for x in d)
45+
)
46+
47+
xi = [1.47, 1.50, 1.52, 1.55, 1.57, 1.60, 1.63, 1.65, 1.68, 1.70, 1.73, 1.75, 1.78, 1.80, 1.83]
48+
yi = [52.21, 53.12, 54.48, 55.84, 57.20, 58.57, 59.93, 61.29, 63.11, 64.47, 66.28, 68.10, 69.92, 72.19, 74.46]
49+
print(
50+
len(xi), len(yi),
51+
round(corr(xi, yi), 5)
52+
)
53+

functional_program/functional_use_set/functional_xml.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import ssl
22
import urllib.request
33
import xml.etree.ElementTree as XML
4+
from math import radians, sin, cos, sqrt, asin
45
from typing import Text, List, TextIO, Iterable, Tuple, TypeVar, Iterator
56

67
ssl._create_default_https_context = ssl._create_unverified_context
@@ -58,6 +59,30 @@ def float_from_pair(lat_lon_iter: Text_Iter) -> LL_Iter:
5859
)
5960

6061

62+
MI = 3959
63+
NM = 3440
64+
KM = 6371
65+
Point = Tuple[float, float]
66+
67+
68+
def haversine(p1: Point, p2: Point, R: float=NM) -> float:
69+
lat_1, lon_1 = p1
70+
lat_2, lon_2 = p2
71+
72+
delta_lat = radians(lat_2 - lat_1)
73+
delta_lon = radians(lon_2 - lon_1)
74+
75+
lat_1 = radians(lat_1)
76+
lat_2 = radians(lat_2)
77+
78+
a = sqrt(
79+
sin(delta_lat / 2) ** 2 +
80+
cos(lat_1) * cos(lat_2) * sin(delta_lon / 2) ** 2
81+
)
82+
c = 2 * asin(a)
83+
return R * c
84+
85+
6186
url = 'https://raw.githubusercontent.com/googlearchive/kml-samples/gh-pages/kml_handbook/mvdoqq.kml'
6287
with urllib.request.urlopen(url) as source:
6388
v1 = tuple(row_iter_kml(source))
@@ -74,8 +99,6 @@ def float_from_pair(lat_lon_iter: Text_Iter) -> LL_Iter:
7499
for item in legs(flt):
75100
print(item)
76101

77-
print(tuple(flt))
78-
79102

80103
with urllib.request.urlopen(url) as source:
81104
v3 = legs(float_from_pair(
@@ -85,3 +108,14 @@ def float_from_pair(lat_lon_iter: Text_Iter) -> LL_Iter:
85108
print(tuple(v3))
86109

87110

111+
with urllib.request.urlopen(url) as source:
112+
trip = (
113+
(start, end, round(haversine(start, end), 4))
114+
for start, end in
115+
legs(float_from_pair(lat_lon_kml(row_iter_kml(source))))
116+
)
117+
118+
119+
for start, end, dist in trip:
120+
print(start, end, dist)
121+

0 commit comments

Comments
 (0)