diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fd16396..4d70e85 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -5,4 +5,5 @@ # berpegang penuh dalam repositori # tanda * merupakan yang meninjau segala aspek pada repositori -* @slowy07 \ No newline at end of file +* @slowy07 @abnvlf +*.md @dherlyar @random-prog diff --git a/.github/workflows/pythontesting.yml b/.github/workflows/pythontesting.yml index 5915f77..b281c67 100644 --- a/.github/workflows/pythontesting.yml +++ b/.github/workflows/pythontesting.yml @@ -24,6 +24,7 @@ jobs: - name: install requirement run: | python -m pip install --upgrade pip + python -m pip install -r requirements.txt python -m pip install -r dev-requirements.txt - name: cek kode dengan flake8 diff --git a/OpenSeries/statistika.py b/OpenSeries/statistika.py new file mode 100644 index 0000000..21c39f0 --- /dev/null +++ b/OpenSeries/statistika.py @@ -0,0 +1,43 @@ +import numpy as np +from typing import Union +from OpenSeries.util import error as pesan_error + + +def entropy(label: list[int], base: int = None) -> Union[float, int, str]: + """ + fungsi menghitung entropy dari suatu fitur pada suatu dataset + + parameter: + label (list (int)): label fitur yang akan di hitung entropynya + """ + if not isinstance(label, (list)): + return pesan_error.error_tipe_data(["list"]) + if not label: + return pesan_error.error_format("label tidak boleh kosong") + if not all(isinstance(cek_nilai, int) for cek_nilai in label): + return pesan_error.error_tipe_data(["int"]) + _, count = np.unique(label, return_counts=True) + probabilitas = count / len(label) + probabilitas[probabilitas == 0] = 1 + + log = np.log(probabilitas) if base is None else np.log(probabilitas) / np.log(base) + return np.sum(abs(probabilitas * log)) + + +def standar_deviasi(vektor: np.ndarray) -> Union[float, str]: + """ + fungsi untuk mengukur penyebaran data terhadap nilai rata-ratanya + + parameter: + vektor (np.array) + """ + if not isinstance(vektor, np.ndarray): + return pesan_error.error_tipe_data(["numpy array"]) + if len(vektor) == 0: + return pesan_error.error_format("vektor tidak boleh kosong") + + mean_value = np.mean(vektor) + squared_diff = np.square(vektor - mean_value) + variansi = np.mean(squared_diff) + std_deviasi = np.sqrt(variansi) + return std_deviasi diff --git a/example/example_fisika.py b/example/example_fisika.py deleted file mode 100644 index 7202086..0000000 --- a/example/example_fisika.py +++ /dev/null @@ -1,55 +0,0 @@ -# contoh sederhana dari fungsi-fungsi fisika -# sumber file: OpenSeries/fisika.py -import OpenSeries.fisika as fisika - -# fungsi menghitung kecepatan -print("hitung kecepatan") -result_kecepatan = fisika.kecepatan(4, 2.3) -print(f"hasil dari kecepatan adalah: {result_kecepatan}\n") - -# fungsi menghitung percepatan -print("hitung percepatan") -result_percepatan = fisika.percepatan(4, 2.3) -print(f"hasil dari percepatan adalah: {result_percepatan}\n") - -# fungsi menghitung glbb -print("hitung glbb (gerak lurus beraturan)") -result_glbb = fisika.gerak_lurus_beraturan(10, 2, 3) -print(f"hasil dari glbb adalah: {result_glbb}\n") - -# fungsi menghitung energi kinetik -massa_benda = 14 -kecepatan_benda = 23.4 -print( - f"menghitung energi kinetik pada benda {massa_benda} kg dengan kecepatan {kecepatan_benda} m/s" -) -print( - f"hasilnya adalah : {fisika.energi_kinetik(massa_benda, kecepatan_benda)} joule\n" -) - -# menghitung masa jenis benda -volume_benda = 8 -print( - f"menghitung massa jenis benda dengan massa benda {massa_benda} gram, dan volume benda {volume_benda} cm3" -) -print(f"hasilnya adalah : {fisika.masa_jenis(massa_benda, volume_benda)}\n") - -# menghitung energi potensial -massa_benda_potensial = 12 -gravitasi_bumi = 9.78 -ketinggian_benda = 400 -print("menghitung energi potensial dari suatu benda") -print(f"dengan massa benda adalah: {massa_benda_potensial}") -print(f"gravitasi bumi {gravitasi_bumi}") -print(f"dan ketinggian benda adalah {ketinggian_benda}") -print( - f"hasilnya adalah: {fisika.energi_potensial(massa_benda_potensial, gravitasi_bumi, ketinggian_benda)}\n" -) - -# menghitung hukum arus ohm -kuat_arus = 30 -hambatan = 3 -print("menghitung hukum ohm") -print(f"dengan kuat arus {kuat_arus}") -print(f"hambatan {hambatan}") -print(f"hasilnya adalah: {fisika.hukum_ohm(kuat_arus, hambatan)}\n") diff --git a/example/example_matematika.py b/example/example_matematika.py deleted file mode 100644 index f98c99d..0000000 --- a/example/example_matematika.py +++ /dev/null @@ -1,59 +0,0 @@ -import OpenSeries.matematika as matematika -import OpenSeries.util.constant as konstanta - -print("menampilkan nilai konstan") -print(f"nilai dari pi adalah: {str(konstanta.pi)}\n") - -print("hitung jari jari lingkaran") -hasil_jari_lingkaran = matematika.luas_lingkaran(4.5) -print(f"hasil dari hitung jari jari lingkaran: {hasil_jari_lingkaran}\n") - -nilai_rata = [2, 3, 5, 5, 6, 1, 2, 3] -print(f"menghitung nilai rata-rata dari {nilai_rata}") -print(f"hasilnya adalah: {matematika.rata_rata(nilai_rata)}\n") - -nilai_faktorial = 25 -print(f"menghitung nilai faktorial dari angka {nilai_faktorial}") -print(f"hasilnya adalah : {matematika.faktorial(nilai_faktorial)}\n") - -nilai_permutasi = 12 -print(f"menghitung nilai permutasi dari {nilai_permutasi}") -print(f"hasilnya adalah : {matematika.permutasi(nilai_permutasi, 2)}\n") - -nilai_kombinasi = 15 -print(f"menghitung nilai kombinasi dari {nilai_kombinasi}") -print(f"hasilnya adalah : {matematika.kombinasi(nilai_kombinasi, 3)}\n") - -nilai1 = 24 -nilai2 = 40 -print( - f"hitung nilai fpb (faktor persekutuan terbesar) dari nilai {nilai1} dan {nilai2}" -) -print(f"hasilnya adalah : {matematika.fpb(nilai1, nilai2)}\n") - -rentang_nilai = 300 -print( - f"rentang nilai {rentang_nilai} faktor prima adalah {matematika.faktor_prima(rentang_nilai)}\n" -) - -nilai_A = 5 -nilai_S = 10 - -print("menghitung probabilitas suatu kejadian") -print(f"dengan jumlah hasil yang menguntungkan :{nilai_A}") -print(f"dan dengan ukuran ruang sampel {nilai_S}") -print( - f"probabilitas dari kejadiannya adalah: {matematika.peluang_kejadian(nilai_A, nilai_S)}\n" -) - - -nilai_suku = 5 -suku_pertama = 3 -selisih_suku = 2 -print("menghitung jumlah deret aritmatika") -print(f"dengan nilai suku: {nilai_suku}") -print(f"suku pertama: {suku_pertama}") -print(f"selisih suku: {selisih_suku}") -print( - f"hasilnya adalah: {matematika.hitung_jumlah_deret(nilai_suku, suku_pertama, selisih_suku)}\n" -) diff --git a/example/__init__.py b/example/fisika/__init__.py similarity index 100% rename from example/__init__.py rename to example/fisika/__init__.py diff --git a/example/fisika/energi_kinetik.py b/example/fisika/energi_kinetik.py new file mode 100644 index 0000000..d9db789 --- /dev/null +++ b/example/fisika/energi_kinetik.py @@ -0,0 +1,11 @@ +import OpenSeries.fisika as fisika + +# fungsi menghitung energi kinetik +massa_benda = 14 +kecepatan_benda = 23.4 +print( + f"menghitung energi kinetik pada benda {massa_benda} kg dengan kecepatan {kecepatan_benda} m/s" +) +print( + f"hasilnya adalah : {fisika.energi_kinetik(massa_benda, kecepatan_benda)} joule\n" +) diff --git a/example/fisika/energi_potensial.py b/example/fisika/energi_potensial.py new file mode 100644 index 0000000..a891155 --- /dev/null +++ b/example/fisika/energi_potensial.py @@ -0,0 +1,13 @@ +import OpenSeries.fisika as fisika + +# menghitung energi potensial +massa_benda_potensial = 12 +gravitasi_bumi = 9.78 +ketinggian_benda = 400 +print("menghitung energi potensial dari suatu benda") +print(f"dengan massa benda adalah: {massa_benda_potensial}") +print(f"gravitasi bumi {gravitasi_bumi}") +print(f"dan ketinggian benda adalah {ketinggian_benda}") +print( + f"hasilnya adalah: {fisika.energi_potensial(massa_benda_potensial, gravitasi_bumi, ketinggian_benda)}\n" +) diff --git a/example/fisika/glbb.py b/example/fisika/glbb.py new file mode 100644 index 0000000..10994cc --- /dev/null +++ b/example/fisika/glbb.py @@ -0,0 +1,6 @@ +import OpenSeries.fisika as fisika + +# fungsi menghitung glbb +print("hitung glbb (gerak lurus beraturan)") +result_glbb = fisika.gerak_lurus_beraturan(10, 2, 3) +print(f"hasil dari glbb adalah: {result_glbb}\n") diff --git a/example/fisika/hukum_ohm.py b/example/fisika/hukum_ohm.py new file mode 100644 index 0000000..23be31e --- /dev/null +++ b/example/fisika/hukum_ohm.py @@ -0,0 +1,9 @@ +import OpenSeries.fisika as fisika + +# menghitung hukum arus ohm +kuat_arus = 30 +hambatan = 3 +print("menghitung hukum ohm") +print(f"dengan kuat arus {kuat_arus}") +print(f"hambatan {hambatan}") +print(f"hasilnya adalah: {fisika.hukum_ohm(kuat_arus, hambatan)}\n") diff --git a/example/fisika/kecepatan.py b/example/fisika/kecepatan.py new file mode 100644 index 0000000..bfb7055 --- /dev/null +++ b/example/fisika/kecepatan.py @@ -0,0 +1,5 @@ +import OpenSeries.fisika as fisika + +print("hitung kecepatan") +result_kecepatan = fisika.kecepatan(4, 2.3) +print(f"hasil dari kecepatan adalah: {result_kecepatan}\n") diff --git a/example/fisika/masa_jenis_benda.py b/example/fisika/masa_jenis_benda.py new file mode 100644 index 0000000..1b5755e --- /dev/null +++ b/example/fisika/masa_jenis_benda.py @@ -0,0 +1,9 @@ +import OpenSeries.fisika as fisika + +# menghitung masa jenis benda +massa_benda = 14 +volume_benda = 8 +print( + f"menghitung massa jenis benda dengan massa benda {massa_benda} gram, dan volume benda {volume_benda} cm3" +) +print(f"hasilnya adalah : {fisika.masa_jenis(massa_benda, volume_benda)}\n") diff --git a/example/fisika/percepatan.py b/example/fisika/percepatan.py new file mode 100644 index 0000000..82cd68f --- /dev/null +++ b/example/fisika/percepatan.py @@ -0,0 +1,5 @@ +import OpenSeries.fisika as fisika + +print("hitung percepatan") +result_percepatan = fisika.percepatan(4, 2.3) +print(f"hasil dari percepatan adalah: {result_percepatan}\n") diff --git a/example/matematika/__init__.py b/example/matematika/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/example/matematika/deret_aritmatika.py b/example/matematika/deret_aritmatika.py new file mode 100644 index 0000000..f9c130a --- /dev/null +++ b/example/matematika/deret_aritmatika.py @@ -0,0 +1,12 @@ +import OpenSeries.matematika as matematika + +nilai_suku = 5 +suku_pertama = 3 +selisih_suku = 2 +print("menghitung jumlah deret aritmatika") +print(f"dengan nilai suku: {nilai_suku}") +print(f"suku pertama: {suku_pertama}") +print(f"selisih suku: {selisih_suku}") +print( + f"hasilnya adalah: {matematika.hitung_jumlah_deret(nilai_suku, suku_pertama, selisih_suku)}\n" +) diff --git a/example/matematika/fpb.py b/example/matematika/fpb.py new file mode 100644 index 0000000..0566853 --- /dev/null +++ b/example/matematika/fpb.py @@ -0,0 +1,8 @@ +import OpenSeries.matematika as matematika + +nilai1 = 24 +nilai2 = 40 +print( + f"hitung nilai fpb (faktor persekutuan terbesar) dari nilai {nilai1} dan {nilai2}" +) +print(f"hasilnya adalah : {matematika.fpb(nilai1, nilai2)}\n") diff --git a/example/matematika/jari_lingkaran.py b/example/matematika/jari_lingkaran.py new file mode 100644 index 0000000..5b8c2ba --- /dev/null +++ b/example/matematika/jari_lingkaran.py @@ -0,0 +1,5 @@ +import OpenSeries.matematika as matematika + +print("hitung jari jari lingkaran") +hasil_jari_lingkaran = matematika.luas_lingkaran(4.5) +print(f"hasil dari hitung jari jari lingkaran: {hasil_jari_lingkaran}\n") diff --git a/example/matematika/nilai_faktorial.py b/example/matematika/nilai_faktorial.py new file mode 100644 index 0000000..0ac7388 --- /dev/null +++ b/example/matematika/nilai_faktorial.py @@ -0,0 +1,5 @@ +import OpenSeries.matematika as matematika + +nilai_faktorial = 25 +print(f"menghitung nilai faktorial dari angka {nilai_faktorial}") +print(f"hasilnya adalah : {matematika.faktorial(nilai_faktorial)}\n") diff --git a/example/matematika/nilai_kombinasi.py b/example/matematika/nilai_kombinasi.py new file mode 100644 index 0000000..e77d4a2 --- /dev/null +++ b/example/matematika/nilai_kombinasi.py @@ -0,0 +1,5 @@ +import OpenSeries.matematika as matematika + +nilai_kombinasi = 15 +print(f"menghitung nilai kombinasi dari {nilai_kombinasi}") +print(f"hasilnya adalah : {matematika.kombinasi(nilai_kombinasi, 3)}\n") diff --git a/example/matematika/nilai_konstan.py b/example/matematika/nilai_konstan.py new file mode 100644 index 0000000..0406df3 --- /dev/null +++ b/example/matematika/nilai_konstan.py @@ -0,0 +1,4 @@ +import OpenSeries.util.constant as konstanta + +print("menampilkan nilai konstan") +print(f"nilai dari pi adalah: {str(konstanta.pi)}\n") diff --git a/example/matematika/nilai_permutasi.py b/example/matematika/nilai_permutasi.py new file mode 100644 index 0000000..a86e865 --- /dev/null +++ b/example/matematika/nilai_permutasi.py @@ -0,0 +1,5 @@ +import OpenSeries.matematika as matematika + +nilai_permutasi = 12 +print(f"menghitung nilai permutasi dari {nilai_permutasi}") +print(f"hasilnya adalah : {matematika.permutasi(nilai_permutasi, 2)}\n") diff --git a/example/matematika/nilai_rata_rata.py b/example/matematika/nilai_rata_rata.py new file mode 100644 index 0000000..588768a --- /dev/null +++ b/example/matematika/nilai_rata_rata.py @@ -0,0 +1,5 @@ +import OpenSeries.matematika as matematika + +nilai_rata = [2, 3, 5, 5, 6, 1, 2, 3] +print(f"menghitung nilai rata-rata dari {nilai_rata}") +print(f"hasilnya adalah: {matematika.rata_rata(nilai_rata)}\n") diff --git a/example/matematika/probabilitias.py b/example/matematika/probabilitias.py new file mode 100644 index 0000000..9224e6e --- /dev/null +++ b/example/matematika/probabilitias.py @@ -0,0 +1,11 @@ +import OpenSeries.matematika as matematika + +nilai_A = 5 +nilai_S = 10 + +print("menghitung probabilitas suatu kejadian") +print(f"dengan jumlah hasil yang menguntungkan :{nilai_A}") +print(f"dan dengan ukuran ruang sampel {nilai_S}") +print( + f"probabilitas dari kejadiannya adalah: {matematika.peluang_kejadian(nilai_A, nilai_S)}\n" +) diff --git a/example/matematika/rentang_nilai_faktor_prima.py b/example/matematika/rentang_nilai_faktor_prima.py new file mode 100644 index 0000000..cd8da66 --- /dev/null +++ b/example/matematika/rentang_nilai_faktor_prima.py @@ -0,0 +1,6 @@ +import OpenSeries.matematika as matematika + +rentang_nilai = 300 +print( + f"rentang nilai {rentang_nilai} faktor prima adalah {matematika.faktor_prima(rentang_nilai)}\n" +) diff --git a/example/statistika/__init__.py b/example/statistika/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/example/statistika/entropy.py b/example/statistika/entropy.py new file mode 100644 index 0000000..8158ff5 --- /dev/null +++ b/example/statistika/entropy.py @@ -0,0 +1,6 @@ +from OpenSeries import statistika as statistika + +# contoh dari entropy +label = [1, 1, 2, 2, 3, 3] +hasil_base_2 = statistika.entropy(label, base=2) +print(hasil_base_2) diff --git a/example/statistika/standar_deviasi.py b/example/statistika/standar_deviasi.py new file mode 100644 index 0000000..eb8bc06 --- /dev/null +++ b/example/statistika/standar_deviasi.py @@ -0,0 +1,7 @@ +import numpy as np +from OpenSeries import statistika as statistika + +# contoh dari standar deviasi +vektor = np.array([1, 2, 3, 4, 5]) +hasil = statistika.standar_deviasi(vektor) +print(hasil) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..24ce15a --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +numpy diff --git a/setup.py b/setup.py index 8e542ce..381f3fd 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,21 @@ from setuptools import setup, find_packages +from os import path +import io +import platform # membuka file README with open("README.md") as file_readme: readme = file_readme.read() +# buat installasi requirement dari requirements agar auto install +info = path.abspath(path.dirname(__file__)) +with io.open(path.join(info, "requirements.txt"), encoding="utf-8") as file: + core_require = file.read().split("\n") + if platform.system == "windows": + core_require.append("pywin32") + +install_require = [x.strip() for x in core_require if "git+" not in x] + # setup nama project setup( # nama dari project @@ -32,6 +44,8 @@ "Programming Language :: Python :: 3.12", "Operating System :: OS Independent", ], + # fungsi untuk menginstall package tambahan dari requirements + install_requires=install_require, # lisensi dari project license="MIT License", project_urls={ diff --git a/testing/main_test.py b/testing/main_test.py index 54cee89..b7fec00 100644 --- a/testing/main_test.py +++ b/testing/main_test.py @@ -20,6 +20,8 @@ TestEnergiKinetik, ) +from testing.statistika_test import TestFungsiEntropy, TestFungiStandardDeviasi + if __name__ == "__main__": testing_matematika: list = [ TestKelilingLingkaran, @@ -42,6 +44,11 @@ TestEnergiKinetik, ] + testing_statistika: list = [ + TestFungsiEntropy, + TestFungiStandardDeviasi, + ] + all_tests = unittest.TestSuite() for testing_math in testing_matematika: @@ -50,4 +57,9 @@ for testing_physic in testing_fisika: all_tests.addTest(unittest.TestLoader().loadTestsFromTestCase(testing_physic)) + for testing_statistik in testing_statistika: + all_tests.addTest( + unittest.TestLoader().loadTestsFromTestCase(testing_statistik) + ) + unittest.TextTestRunner(verbosity=2).run(all_tests) diff --git a/testing/statistika_test.py b/testing/statistika_test.py new file mode 100644 index 0000000..c12edea --- /dev/null +++ b/testing/statistika_test.py @@ -0,0 +1,43 @@ +import unittest +import numpy as np +from OpenSeries import statistika as statistika +from OpenSeries.util import error as pesan_error + + +class TestFungsiEntropy(unittest.TestCase): + def test_entropy_dengan_none(self): + label = [1, 1, 2, 2, 3, 3] + hasil = statistika.entropy(label) + self.assertFalse(np.allclose(hasil, 1.584962500721156)) + + def test_nilai_kosong(self): + label = [] + hasil = statistika.entropy(label) + self.assertEqual(hasil, pesan_error.error_format("label tidak boleh kosong")) + + def test_nilai_element_dalam_label(self): + label = [1, 2, "3", 4] + hasil = statistika.entropy(label) + self.assertEqual(hasil, pesan_error.error_tipe_data(["int"])) + + def test_tipe_data_tuple(self): + label = (1, 2, 3) + hasil = statistika.entropy(label) + self.assertEqual(hasil, pesan_error.error_tipe_data(["list"])) + + +class TestFungiStandardDeviasi(unittest.TestCase): + def test_standard_deviasi_dengan_numpy_array(self): + vektor = np.array([1, 2, 3, 4, 5]) + hasil = statistika.standar_deviasi(vektor) + self.assertAlmostEqual(hasil, np.std(vektor), places=2) + + def test_standard_deviasi_dengan_list(self): + vektor = [1, 2, 3, 4, 5] + hasil = statistika.standar_deviasi(vektor) + self.assertEqual(hasil, pesan_error.error_tipe_data(["numpy array"])) + + def test_standard_deviasi_dengan_numpy_kosong(self): + vektor = np.array([]) + hasil = statistika.standar_deviasi(vektor) + self.assertEqual(hasil, pesan_error.error_format("vektor tidak boleh kosong"))