mpba / pyphysio Goto Github PK
View Code? Open in Web Editor NEWLicense: GNU General Public License v3.0
License: GNU General Public License v3.0
got to pick it up
This method has been apparently (wrongly) removed.
Result of np.shape(Signal.get_values()) is (N,1).
Should be (N,).
[Numpy version 1.11.0]
How to reproduce:
from __future__ import division
import numpy as np
import pandas as pd
import pyphysio as ph
FILE = '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/sample_data/medical.txt'
FSAMP = 2048
TSTART = 0
data = np.loadtxt(FILE, delimiter='\t')
ecg = ph.EvenlySignal(data[:, 0], sampling_freq = FSAMP, signal_nature = 'ECG', start_time = TSTART)
ecg_bp = ph.IIRFilter(fp=[10, 50], fs=[0.01, 70])(ecg) # <==
Traceback (most recent call last):
File "<ipython-input-43-61d61d81a620>", line 1, in <module>
ecg_bp = ph.IIRFilter(fp=[10, 50], fs=[0.01, 70])(ecg) # OK
File "pyphysio/BaseAlgorithm.py", line 50, in __call__
return self.get(data, self._params)
File "pyphysio/BaseAlgorithm.py", line 79, in get
return cls.algorithm(data, kwargs)
File "pyphysio/filters/Filters.py", line 175, in algorithm
cls.warn(cls.__name__ + ': Filter parameters allow no solution. Returning original signal.')
File "pyphysio/BaseAlgorithm.py", line 144, in warn
cls.emulate_log([l])
File "pyphysio/BaseAlgorithm.py", line 168, in emulate_log
map(lambda f, m: f(m), log)
TypeError: <lambda>() takes exactly 2 arguments (1 given)
An additional window (end part of the signal, label=2) is expected.
# import libraries
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
# for windowed plots
get_ipython().magic(u'matplotlib qt')
# import all pyphysio classes and methods
import pyphysio as ph
# In[2]:
# import data and creating a signal
ecg_data = ph.TestData.ecg()
fsamp = 2048
ecg = ph.EvenlySignal(values = ecg_data, sampling_freq = fsamp, signal_nature = 'ecg')
# In[3]:
ecg.plot()
# ** Step 1: Filtering and preprocessing **
# In[4]:
# (optional) IIR filtering : remove high frequency noise
ecg = ph.IIRFilter(fp=45, fs = 50, ftype='ellip')(ecg)
# In[5]:
# normalization : normalize data
ecg = ph.Normalize(norm_method='standard')(ecg)
# In[6]:
# resampling : increase the sampling frequency by cubic interpolation
ecg = ecg.resample(fout=4096, kind='cubic')
fsamp = 4096
# In[7]:
ecg.plot()
# ** Step 2: Information Extraction **
#
# The information we want to extract from the ECG signal is the position of the heartbeats and the Inter Beat Interval signal.
# In[8]:
ibi = ph.BeatFromECG()(ecg)
# In[9]:
# check results so far
ax1 = plt.subplot(211)
ecg.plot()
plt.vlines(ibi.get_times(), np.min(ecg), np.max(ecg))
plt.subplot(212, sharex = ax1)
ibi.plot('o-')
plt.vlines(ibi.get_times(), np.min(ibi), np.max(ibi))
plt.show()
# ** Step 3: Physiological Indicators **
# In[10]:
# define a list of indicators we want to compute
hrv_indicators = [ph.Mean(name='RRmean'), ph.StDev(name='RRstd'), ph.RMSSD(name='rmsSD'),
ph.PowerInBand(name = 'HF', interp_freq=4, freq_max=0.4, freq_min=0.15, method = 'ar'),
ph.PowerInBand(name = 'LF', interp_freq=4, freq_max=0.15, freq_min=0.04, method = 'ar')
]
# In[11]:
# create fake label
label = np.zeros(1200)
label[300:600] = 1
label[900:1200] = 2
label = ph.EvenlySignal(label, sampling_freq = 10, signal_nature = 'label')
# In[25]:
# check label
ax1 = plt.subplot(211)
ibi.plot('.-')
plt.subplot(212, sharex = ax1)
label.plot('.-')
plt.show()
# In[16]:
#fixed length windowing
fixed_length = ph.FixedSegments(step = 5, width = 20, labels = label)
indicators, col_names = ph.fmap(fixed_length(ibi), hrv_indicators)
# In[19]:
# extract column with the labels for each window
label_w = indicators[:, np.where(col_names == 'label')[0]]
# extract column with the RRmean values computed from each window
rrmean_w = indicators[:, np.where(col_names == 'RRmean')[0]]
# create a box and whisker plot
plt.boxplot([rrmean_w[label_w==1], rrmean_w[label_w==2]],
labels=['image1', 'image2'])
plt.show()
# In[21]:
#label based windowing
label_based = ph.LabelSegments(labels = label)
indicators, col_names = ph.fmap(label_based(ibi), hrv_indicators)
# In[23]:
indicators[:,0:2]
# In[32]:
custom_based = ph.CustomSegments(begins = [0, 30, 60, 90], ends = [30, 60, 90, label.get_duration()], labels=label, drop_shorter=False, drop_mixed=False)
indicators, col_names = ph.fmap(custom_based, hrv_indicators, ibi)
indicators[:,0:2]
# In[29]:
len(label)
# In[ ]:
# ### 2.2 EDA processing pipeline
# ** Step 0: Import data **
# In[ ]:
# import data and creating a signal
eda_data = ph.TestData.eda()
fsamp = 2048
eda = ph.EvenlySignal(values = eda_data, sampling_freq = fsamp, signal_nature = 'eda')
eda.plot()
# ** Step 1: Filtering and preprocessing **
# In[ ]:
# resampling : decrease the sampling frequency by cubic interpolation
eda = eda.resample(fout=8, kind='cubic')
# In[ ]:
# IIR filtering : remove high frequency noise
eda = ph.IIRFilter(fp=0.8, fs = 1.1, ftype='ellip')(eda)
# In[ ]:
eda.plot()
# ** Step 2: Information Extraction **
#
# The information we want to extract from the EDA signal is the phasic component associated to the sympathetic activity.
# In[ ]:
# estimate the driver function
driver = ph.DriverEstim(delta=0.02)(eda)
# In[ ]:
# compute the phasic component
phasic, tonic, _ = ph.PhasicEstim(delta=0.02)(driver)
phasic.plot()
# In[ ]:
# check results so far
ax1 = plt.subplot(211)
eda.plot()
plt.subplot(212, sharex = ax1)
driver.plot()
phasic.plot()
plt.grid()
plt.show()
# ** Step 3: Physiological Indicators **
# In[ ]:
# define a list of indicators we want to compute
indicators = [ph.Mean(), ph.StDev(), ph.AUC(),
ph.PeaksMean(delta=0.02),
ph.DurationMean(delta=0.02)
]
# In[ ]:
# define the windowing method
When pip install pyphysio, the tutorials should be installed in the home directory
test_indicators_hrv is performed on an ibi signal of constant 10.
**interp_parameters should be given to ph.PSD to allow the control of the interpolation when the input signal is of type unevenly.
For now only the values are sliced, the slicing should trigger the slicing of indices, times etc.
In : type(ibi_curr_th)
Out : pyphysio.Signal.UnevenlySignal
In : ph.Mean()(ibi_curr_th)
Warning: The data must be a Signal (see class EvenlySignal and UnevenlySignal).
Out : 0.57361778846153844
In : isinstance(ibi_curr_th, Signal)
Out : True
Check
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-31-f8c2fba97632> in <module>()
1 # compute indicators over the segments
----> 2 result = ph.fmap(fixed_length, indicators, ibi)
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/__init__.pyc in fmap(segments, algorithms, alt_signal)
136 from numpy import asarray as _asarray
137 values = _asarray([[seg.get_begin_time(), seg.get_end_time()] + [alg(seg(alt_signal)) for alg in algorithms]
--> 138 for seg in segments])
139 labels = _asarray([seg.get_label() for seg in segments])
140 col_names = ["begin", "end"] + map(lambda x: x.__repr__(), algorithms)
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/BaseSegmentation.pyc in __call__(self, data)
48 if data is None:
49 data = self._signal
---> 50 return data.segment_time(self.get_begin_time(), self.get_end_time())
51
52 def __repr__(self):
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/Signal.pyc in segment_time(self, t_start, t_stop)
425
426 return self.segment_idx(self.get_idx(t_start) if t_start is not None else None,
--> 427 self.get_idx(t_stop) if t_stop is not None else None)
428
429 def segment_idx(self, idx_start, idx_stop=None):
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/Signal.pyc in segment_idx(self, idx_start, idx_stop)
448 idx_start = 0
449
--> 450 iidx_start = int(self.get_iidx_from_idx(idx_start))
451 iidx_stop = int(self.get_iidx_from_idx(idx_stop))
452
TypeError: int() argument must be a string or a number, not 'NoneType'
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-33-f8c2fba97632> in <module>()
1 # compute indicators over the segments
----> 2 result = ph.fmap(fixed_length, indicators, ibi)
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/__init__.pyc in fmap(segments, algorithms, alt_signal)
136 from numpy import asarray as _asarray
137 values = _asarray([[seg.get_begin_time(), seg.get_end_time()] + [alg(seg(alt_signal)) for alg in algorithms]
--> 138 for seg in segments])
139 labels = _asarray([seg.get_label() for seg in segments])
140 col_names = ["begin", "end"] + map(lambda x: x.__repr__(), algorithms)
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/BaseSegmentation.pyc in __iter__(self)
87
88 def __iter__(self):
---> 89 return SegmentationIterator(self)
90
91 @classmethod
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/BaseSegmentation.pyc in __init__(self, win)
118 assert isinstance(win, SegmentsGenerator)
119 self._win = _cpy(win)
--> 120 self._win.init_segmentation()
121
122 def next(self):
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/segmentation/SegmentsGenerators.pyc in init_segmentation(self)
133 self._labsig = self._params["labels"]
134 s = self._params["start"]
--> 135 self._t = s if s is not None else self._signal.get_start_time()
136
137 def next_times(self):
AttributeError: 'NoneType' object has no attribute 'get_start_time'
import numpy as np
import pyphysio as ph
FSAMP = 100
n = np.arange(1000)
t = n / FSAMP
freq = 1
#create reference signal
sinusoid = ph.EvenlySignal(np.sin(2 * np.pi * freq * t), sampling_freq = FSAMP, signal_nature = '', start_time = 0)
# remove some samples
sinusoid_unevenly = ph.UnevenlySignal(np.delete(sinusoid.get_values(), [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]),
sampling_freq = FSAMP, signal_nature = '', start_time = 0,
x_values = np.delete(sinusoid.get_times(), [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]),
x_type='instants')
np.sum(sinusoid_unevenly.get_times() - np.delete(sinusoid.get_times(), [10,11,12,13,14,15,16,17,18,19,20,21,22,23,24])) # NOT EQUAL TO ZERO
e.g.:
ph.HRV_TimeDomain()
ph.HRV_FrequencyDomain()
returns a list for fmap
Now we should write:
import pyphysio.filters.FIlters as flt
why not just:
import pyphysio.Filters as flt
Add a "memory" of the interpolated UnevenlySignal (whole signal) when to which refer when segmenting
Implement a validation of the input fs and fp such as there exists a filter
# create a signal
## create fake data
signal_values = np.arange(100)
## create fake indices
idx = np.arange(100)
idx[-1] = 125
## set the sampling frequency
fsamp = 10 # Hz
## set the starting time
tstart = 0 # s
## create an Unevenly signal defining the indices
x_values_idx = idx
s_fake_idx = UnevenlySignal(values = signal_values, sampling_freq = fsamp, signal_nature = 'fake', start_time = tstart,
x_values = x_values_idx, x_type = 'indices')
## create an Unevenly signal defining the indices
x_values_time = idx/fsamp + 1
s_fake_time = UnevenlySignal(values = signal_values, sampling_freq = fsamp, signal_nature = 'fake',# start_time = tstart,
x_values = x_values_time, x_type = 'instants')
# segmentation of US
s_fake_idx_segment = s_fake_idx.segment_time(4.5, 5)
s_fake_time_segment = s_fake_time.segment_time(4.5, 5)
# plot
ax1 = plt.subplot(211)
s_fake_idx.plot('.-')
s_fake_idx_segment.plot('.-r')
plt.subplot(212, sharex=ax1)
s_fake_time.plot('.-')
s_fake_time_segment.plot('.-r')
signal_unevenly = ph.UnevenlySignal(np.array([1,2,3,4,5,6,8,9,10]),
sampling_freq = 100, signal_nature = '', start_time = 0,
x_values = np.array([1,2,3,4,5,6,7,9,10]),
x_type='instants')
signal_unevenly.get_times()[0] # = 1 <=OK
signal_evenly = signal_unevenly.to_evenly()
signal_evenly.get_times()[0] # = 0 <= KO
Example:
class Asset(object):
asset = "sample_data/"
data = load('medical.txt')
def ecg():
return(data[:,0])
def eda():
return (etc etc)
# create a signal
## create fake data
signal_values = np.arange(100)
## create fake indices
idx = np.arange(100)
idx[-1] = 125
## set the sampling frequency
fsamp = 10 # Hz
## set the starting time
tstart = 10 # s
## create an Unevenly signal defining the indices
x_values_idx = idx
s_fake_idx = UnevenlySignal(values = signal_values, sampling_freq = fsamp, signal_nature = 'fake', start_time = tstart,
x_values = x_values_idx, x_type = 'indices')
s_fake_idx_segment = s_fake_idx.segment_time(4.5, 5)
Traceback:
TypeError Traceback (most recent call last)
<ipython-input-16-04604a1c5589> in <module>()
1 # segmentation of US
2
----> 3 s_fake_idx_segment = s_fake_idx.segment_time(4.5, 5)
4 s_fake_time_segment = s_fake_time.segment_time(4.5, 5)
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/Signal.pyc in segment_time(self, t_start, t_stop)
422
423 return self.segment_idx(self.get_idx(t_start) if t_start is not None else None,
--> 424 self.get_idx(t_stop) if t_stop is not None else None)
425
426 def segment_idx(self, idx_start, idx_stop=None):
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/Signal.pyc in segment_idx(self, idx_start, idx_stop)
445 idx_start = 0
446
--> 447 iidx_start = int(self.get_iidx_from_idx(idx_start))
448 iidx_stop = int(self.get_iidx_from_idx(idx_stop))
449
TypeError: int() argument must be a string or a number, not 'NoneType'
? Only for PSD() ?
Found a bug in Line: 391
if len(signal) >= max_order:
Corrected to:
if len(signal) >= max_order:
Unexpected behaviour when using LabelSegments.
See code below:
from __future__ import division
import numpy as np
import pandas as pd
import os
import pyphysio as ph
import matplotlib.pyplot as plt
#%%
ecg = ph.EvenlySignal(ph.TestData.ecg(), 2048)
ibi = ph.BeatFromECG()(ecg)
labels = np.zeros(len(ecg))
labels[61440:122880] = 1
labels[184320:] = 2
labels = ph.EvenlySignal(labels, 2048)
#%%
windows = ph.LabelSegments(labels=labels)
indicators_td, col_names_td = ph.fmap(windows, ph.preset_hrv_td(prefix=''), ibi)
indicators_fd, col_names_fd = ph.fmap(windows, ph.preset_hrv_fd(prefix=''), ibi.to_evenly().resample(4))
print(indicators_td[:,2])
print(indicators_fd[:,2])
The "spectrum" module imported in pyHRV is missing. It is not being used anyway, perhaps you can remove it (pyHRV.py line "import spectrum as spct").
Provide documentation through __init__ instead of _params_descriptors
from __future__ import division
import numpy as np
import pyphysio as ph
ecg = ph.EvenlySignal(values = ph.TestData.ecg(), sampling_freq = 2048, signal_nature = 'ecg')
ibi = ph.BeatFromECG()(ecg)
# create fake label
label = np.zeros(1200)
label[300:600] = 1
label[900:1200] = 2
label = ph.EvenlySignal(label, sampling_freq = 10, signal_nature = 'label')
t_start = [0.5, 15, 88.7]
t_stop = [5, 21, 110.4]
custom_segments = ph.CustomSegments(begins = t_start, ends = t_stop)
indicators, col_names = ph.fmap(custom_segments, [[ph.Mean()], ibi)
print(indicators[:,2])
$> make test
pytest
=========================================================================== test session starts ============================================================================
platform linux -- Python 3.6.0, pytest-3.0.5, py-1.4.32, pluggy-0.4.0
rootdir: /home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV, inifile:
collected 0 items / 10 errors
================================================================================== ERRORS ==================================================================================
__________________________________________________________________ ERROR collecting tests/test_filters.py __________________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_filters.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_filters.py:5: in <module>
from context import ph, Assets, np
E ModuleNotFoundError: No module named 'context'
__________________________________________________________________ ERROR collecting tests/test_general.py __________________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_general.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_general.py:4: in <module>
from context import ph, Assets
E ModuleNotFoundError: No module named 'context'
______________________________________________________________ ERROR collecting tests/test_ibi_extraction.py _______________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_ibi_extraction.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ibi_extraction.py:3: in <module>
from context import *
E ModuleNotFoundError: No module named 'context'
______________________________________________________________ ERROR collecting tests/test_indicators_eda.py _______________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_indicators_eda.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_indicators_eda.py:4: in <module>
from context import ph, Assets, np, approx
E ModuleNotFoundError: No module named 'context'
______________________________________________________________ ERROR collecting tests/test_indicators_hrv.py _______________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_indicators_hrv.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_indicators_hrv.py:3: in <module>
from context import ph, np, Assets, approx
E ModuleNotFoundError: No module named 'context'
__________________________________________________________________ ERROR collecting tests/test_issues.py ___________________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_issues.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_issues.py:4: in <module>
from context import ph
E ModuleNotFoundError: No module named 'context'
_____________________________________________________________ ERROR collecting tests/test_phasic_estimation.py _____________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_phasic_estimation.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_phasic_estimation.py:3: in <module>
from context import ph, np, Assets, approx
E ModuleNotFoundError: No module named 'context'
______________________________________________________________ ERROR collecting tests/test_some_indicators.py ______________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_some_indicators.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_some_indicators.py:4: in <module>
from context import ph
E ModuleNotFoundError: No module named 'context'
__________________________________________________________________ ERROR collecting tests/test_syntax.py ___________________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_syntax.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_syntax.py:3: in <module>
from context import ph
E ModuleNotFoundError: No module named 'context'
___________________________________________________________________ ERROR collecting tests/test_tools.py ___________________________________________________________________
ImportError while importing test module '/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/tests/test_tools.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_tools.py:4: in <module>
from context import ph, np, Assets, approx
E ModuleNotFoundError: No module named 'context'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 10 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================================================= 10 error in 0.30 seconds =========================================================================
make: *** [Makefile:5: test] Error 2
We need to access sample data for the tutorial (not only for tests)
Example:
from pyphysio import Assets
ecg_data = Assets.ecg()
Added todos in test_indicators_hrv.py
(search for TODO Andrea
)
# create a signal
## create fake data
x = np.arange(100)
idx = np.arange(100)
idx[-1] = 125
## set the sampling frequency
fsamp = 100 # Hz
## set the starting time
tstart = 100 # s
## create the Evenly signal
s_fake = UnevenlySignal(values = x, sampling_freq = fsamp, signal_nature = 'fake', start_time = tstart, x_values = idx, x_type = 'indices')
Should create Unevenly signal starting from 100
Returns:
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-42-30498dfacc96> in <module>()
14 ## create the Evenly signal
15 s_fake = UnevenlySignal(values = x, sampling_freq = fsamp, signal_nature = 'fake', start_time = tstart,
---> 16 x_values = idx, x_type = 'indices')
/home/andrea/Trento/CODICE/workspaces/pyHRV/pyHRV/pyphysio/Signal.pyc in __new__(cls, values, sampling_freq, signal_nature, start_time, x_values, x_type)
301 start_time = 0
302 else:
--> 303 assert start_time < x_values[1] / sampling_freq, "More than one sample at or before start_time"
304 else:
305 if start_time is None:
AssertionError: More than one sample at or before start_time
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.