Catatan Cak Edy

Life and Technology

  • About
  • Kebijakan Privasi
  • Kontak
  • Referensi

sqlite

Data Preparation: Konversi Limesurvey Data dan Pertanyaan ke SQLite dengan Python Citric

04/08/2024

Ini adalah skrip untuk mengambil data hasil survey dan pertanyaan dan mengkonversinya ke dalam sqlite dengan harapan data akan lebih mudah diolah kembali. SQLite sengaja saya pilih agar data bisa diolah langsung dengan SQL dan apabila perlu, hasil olahan bisa disimpan dalam view. Atau, jika menginginkan diolah menggunakan dataframe maka data yang ada dalam sqlite bisa di load dengan mudah.

Hasil dari skrip Python ini adalah

  1. Data pertanyaan yang lengkap berupa kode pertanyaan, pertanyaan, dan kode field dalam database. Lengkap.
  2. Data hasil survey dengan long answer dengan nama field kode pertanyaan. Tapi kamu bisa mengubahnya sendiri jika menginginkan hal yang berbeda.

Saya mengunakan Library Citric pada python dengan dokumentasi disini dan Chat GPT untuk merapikan skripnya.

Ok silahkan …

"""
Script created by Edy Santoso ([email protected])
Created on: 2024-08-02
"""

from citric import Client
import io
import pandas as pd
import sqlite3
import datetime
import re

def remove_tags(raw_html):
    """Remove HTML tags from a string"""
    cleantext = re.sub(re.compile('<.*?>'), '', raw_html)
    return cleantext

# Get the current time for unique database file naming
current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
db_file = f"{current_time}_survey.sqlite3"
conn = sqlite3.connect(db_file)

# Replace with your survey ID
survey_id = 868964

# Initialize the LimeSurvey client
client = Client(
    'http://limesurvey6.test/index.php/admin/remotecontrol',
    'admin',
    'adminpassword'
)

# Get field map for the survey
fieldsmap = client.get_fieldmap(survey_id)

qs = []
for key, field in fieldsmap.items():
    code = ""
    
    # Build the code from title, aid, and scale_id
    if field['title'] != '':
        code += field['title']
    if field['aid'] != '':
        code += f"[{field['aid']}]"
    
    scale_id = field.get('scale_id')
    if scale_id is not None:
        code += f"[{scale_id}]"
    
    # Get subquestion if it exists
    subquestion = field.get('subquestion')
    if subquestion is not None:
        subquestion = f"[{subquestion}]"
    else:
        subquestion = ""

    # Append the field data to the list
    qs.append([
        field['gid'],
        field['qid'],
        field['fieldname'],
        field['type'],
        code, 
        field['group_name'], 
        remove_tags(field['question']),
        subquestion
    ])

# Create DataFrame from the list of field data
df = pd.DataFrame(qs, columns=['gid', 'qid', 'field_name', 'type', 'code', 'group_name', 'question', 'subquestion'])

print('wait...')

# Insert DataFrame into SQLite database
questions_table = 'questions'
df.to_sql(questions_table, conn, if_exists='replace', index=False)
print(f"{questions_table} table created")

# Export responses from LimeSurvey and load into DataFrame
responses_table = 'responses'
with io.BytesIO() as file:
    # heading_type (str | citric.enums.HeadingType) – Use response codes, long or abbreviated titles.
    # response_type (str | citric.enums.ResponseType) – Export long or short text responses.
    # completion_status (str | citric.enums.SurveyCompletionStatus) – Incomplete, complete or all.
    file.write(client.export_responses(survey_id, file_format="csv", heading_type='code', response_type='long'))
    file.seek(0)
    responses_df = pd.read_csv(
        file,
        delimiter=";",
        parse_dates=["datestamp", "startdate", "submitdate"],
        index_col="id",
    )

# Insert responses DataFrame into SQLite database
responses_df.to_sql(responses_table, conn, if_exists='replace', index=False)
print(f"{responses_table} table created")

print('Done!')

Berikut penjelasan dari data diatas:

  1. Import Libraries: Mengimpor pustaka yang diperlukan.
  2. Define remove_tags Function: Mendefinisikan fungsi untuk menghapus tag HTML dari string.
  3. Current Time for Unique DB File Name: Mendapatkan waktu saat ini untuk membuat nama file database yang unik. Ini dilakukan agar nama database yang terbentuk berawalan waktu, dan tidak menimpa hasil generasi sebelumnya.
  4. Database Connection: Membuat koneksi ke file SQLite baru.
  5. Survey ID: Menetapkan ID survei (dapat diganti dengan ID yang diperlukan).
  6. Initialize LimeSurvey Client: Menginisialisasi klien LimeSurvey dengan URL dan kredensial yang diperlukan. Atau dengan kata mudahnya, koneksi ke LimeSurvey API.
  7. Get Field Map: Mengambil “fields map”
  8. Build Question Data: Mengiterasi melalui “field map” untuk membangun data pertanyaan dan menambahkannya ke dalam daftar.
  9. Create DataFrame: Membuat DataFrame dari daftar data pertanyaan.
  10. Insert Questions DataFrame into SQLite: Memasukkan DataFrame pertanyaan ke dalam tabel SQLite.
  11. Export Responses and Load into DataFrame: Mengekspor respons dari LimeSurvey dan memuatnya ke dalam DataFrame.
  12. Insert Responses DataFrame into SQLite: Memasukkan DataFrame respons ke dalam tabel SQLite.
  13. Done: Mencetak pesan selesai.

Dengan format data seperti ini analisa data akan lebih mudah dilakukan,

Posted in: Data Science, Database, Programing, Python Tagged: lymesurvey, python, sqlite

Preparasi Pengolahan Data dengan LimeSurvey API, Python dan SQLite

29/07/2024

Ditempat saya bekerja, sudah biasa melakukan preparasi pengolahan data dengan cara mengambil data survey dalam format csv,  melalui LimeSurvey API dengan menggunakan bahasa R. Data dalam format csv itu kemudian di padukan dengan struktur kuesioner dan diolah.

Memang di Lime Survey penggunaan API menjadi penting karena kalau kita langsung mengakses database, kita akan mendapati sebuah pertanyaan text dengan kode A12 bisa menjadi 452848X96X2183. Nah kalau kita menggunakan API, maka kita bisa mendapatkan data dengan kolom kode pertanyaan.

Ok, saya akan menirukan cara diatas menggunakan Python dengan library limepy. beberapa prosedur yang akan saya lakukan adalah.

  1. Mendownload data menggunakan limepy ke dalam bentuk csv dengan nama respons.csv
  2. Mendwnload struktur pertanyaan dengan nama structure.lss melalui halaman belakang limesurvey.
  3. Menggabungkan keduanya menjadi sebuah file sqlite dengan tabel structure dan respons

Install limepy

Cara install limepy dengan cara pip install limepy

Download response menggunakan limepy

from pathlib import Path
from limepy import download

base_url = 'https://yourlimesurveypath.com/index.php/admin/remotecontrol'
user_name = 'admin'
password = 'yourpassword'
user_id =  1 # nggak tahu mengapa harus ada ini
sid = 868964

csv = download.get_responses(base_url, user_name, password, user_id, sid, lang=None,
                  document_type='csv', completion_status='all',
                  heading_type='short', response_type='long',
                  from_response_id=None, to_response_id=None, fields=None)

path = Path('responses.csv')
path.write_text(csv)

'''
Rerensi:

def get_responses(base_url, user_name, password, user_id, sid, lang=None,
                  document_type='csv', completion_status='all',
                  heading_type='code', response_type='short',
                  from_response_id=None, to_response_id=None, fields=None):
    """Get session key, download and store responses and close session.

    :param base_url: e.g. https://mywebsite.nl/survey.
    :param user_name: LimeSurvey user name
    :param password: LimeSurvey user password
    :param user_id: LimeSurvey user id
    :param sid: LimeSurvey survey id
    :param lang: language. (Default value = None)
    :param document_type: format for results (Default value = 'csv')
    :param completion_status: which responses to export, 'complete',
        'incomplete' or 'all' (Default value = 'all')
    :param heading_type: 'code', 'full' or 'abbreviated'
        (Default value = 'code')
    :param response_type: 'short' or 'long' (Default value = 'short')
    :param from_response_id: for partial export (Default value = None)
    :param to_response_id: for partial export (Default value = None)
    :param fields: for partial export (Default value = None)

'''

Download structure.lss melalui halaman login

Cari di menu Export pada survey yang diinginkan.

Buat data menjadi file SQLite

Mengapa harus dijadikan SQLite, nggak diolah menggunakan dataframe saja.  Alasannya memang cukup memalukan yaitu karena saya lupa sintak pandas karena lama tidak saya gunakan, Sedangkan SQL tidak lupa karena sering saya gunakan.

from limepy.wrangle import Survey, Question
import pandas as pd
import sqlite3
import datetime

df = pd.read_csv('responses.csv', sep=';', encoding='ISO-8859-1')
with open('structure.lss', encoding="ISO-8859-1") as f:
    my_structure = f.read()

my_survey = Survey(df, my_structure,language=None, strip_tags=True)

responses_df = my_survey.dataframe
question_df = my_survey.question_list

current_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
db_file = 'survey.sqlite3'
db_file = f"{current_time}_{db_file}"
conn = sqlite3.connect(db_file)

# Masukkan data dari DataFrame ke dalam tabel SQLite
table_name = 'responses'
responses_df.to_sql(table_name, conn, if_exists='replace', index=False)

table_name = 'questions'
question_df.to_sql(table_name, conn, if_exists='replace', index=False)

# Tutup koneksi ke database
conn.close()

print(f"Data has been inserted into table in {db_file} database.")

Nah. hasilnya akan didapatkan file SQLite yang siap diQuery

Ok, segitu dulu, selamat mencoba ….

Posted in: Python, Uncategorized Tagged: limepy, limesurvey, sqlite

Menggunakan REGEX di SQLite

28/01/2024 / Leave a Comment

Saya ingin menjelaskan implementasi REGEX pada SQLite. Tapi sintak yang saya gunakan bukan library native tapi menggunakan library regex pada sqlean.

OK, langsung saja.

Saya mempunyai data sebagai berikut:

Saya ingin mencari

  1. Distribusi penjualan berdasarkan kota
  2. Distribusi penjualan berdasarkan bulan, tanggal, dan jam.

Tentu saja kita harus melakukan ekstraksi data pada kolom Purchase_Address, dan kolom Order_Date menggunakan fungsi Regex sbb:

1
2
3
4
5
6
7
SELECT  *, 
        REGEXP_CAPTURE(Purchase_Address, '^Jalan .+, (\w+?), .+', 1) || ' ' || 
        REGEXP_CAPTURE(Purchase_Address, ' (\w+) \d+$', 1) AS City, 
        REGEXP_CAPTURE(Order_Date, '^(\d{2})/', 1) AS MONTH,
        REGEXP_CAPTURE(Order_Date, '^\d{2}/(\d{2})', 1) AS DATE,
        REGEXP_CAPTURE(Order_Date, '(\d{2}):\d{2}$', 1) AS HOUR   
FROM sales

SELECT *, REGEXP_CAPTURE(Purchase_Address, '^Jalan .+, (\w+?), .+', 1) || ' ' || REGEXP_CAPTURE(Purchase_Address, ' (\w+) \d+$', 1) AS City, REGEXP_CAPTURE(Order_Date, '^(\d{2})/', 1) AS Month, REGEXP_CAPTURE(Order_Date, '^\d{2}/(\d{2})', 1) AS Date, REGEXP_CAPTURE(Order_Date, '(\d{2}):\d{2}$', 1) AS Hour FROM sales

Lalu simpan dalam view agar mudah kita query kembali.

Dan cuplikan datanya bisa menjadi seperti ini

Posted in: Uncategorized Tagged: sqlite

SQLiteViz

12/01/2024 / Leave a Comment

Selama ini saya memang mencari-cari freeware yang mendukung visualisasi hasil query SQLite. SQLite Studio adalah versi terbaik dalam pengelolaan database sqlite. Memenuhi aspek kelengkapan dan kesederhanaan. Semua model pengolahan data mungkin bisa terpenuhi, tetapi masih dalam bentuk angka.

Sebenarnya akan menjadi sempurna apabila ditambahkan modul visualisasi. Tapi mungkin memang tidak semudah itu.

Tadi menemukan SQliteViz yang menawarkan visualisasi yang cukup lumayan, walaupun tidak menyertakan manajemen database yang baik. Jadinya SQLiteFiz melengkapi SQLiteStudio.

Aplikasi ini berbasis PWA, Progressive Web Application. Situs yang berbasis Javascript, bekerja di level lokal, dan bisa diinstall di Chrome, dan bisa bekerja secara Offline.

Kelebihan aplikasi ini adalah.

  1. Instalasinya mudah (seperti tidak melakukan instalasi)
  2. Mendukung SQLite
  3. Mendukung CSV dan bahkan data CSV bisa diquery
  4. Bisa mengeksport CSV ke Sqlite secara langsung dan otomatis.
  5. Bisa melakukan visualisasi hasil Query melalui library Plotly

Kelemahannya

  1. Hanya bisa menampilkan satu database dalam satu workspace.
  2. Apabila aplikasi di tutup, tidak bisa “keep” database sebelumnya dan model penyimpanan hasil olah data dalam menu inquiry masih terlalu sederhana dan kurang asik.

Demikian 🙂

 

Posted in: Data Science Tagged: sqlite

Donasi. Jika kamu terbantu dengan blog ini dan ingin berdonasi, silahkan berdonasi melalui link ini: Donasi

Kategori

  • Aplikasi (14)
  • Aplikasi Server (9)
  • Catatan (21)
  • Cerita Inspiratif (4)
  • Data Science (26)
  • Database (5)
  • Hardware (2)
  • Internet of Thing (6)
  • JavaScript (2)
  • Management (5)
  • Media (4)
  • Pendidikan (8)
  • PHP (12)
  • Programing (22)
  • Python (14)
  • Scientech (1)
  • Server (11)
  • Teknologi (50)
  • Uncategorized (57)
  • Utility (1)

Tulisan terbaru

  • Tailscale, VPN Modern09/05/2025
  • Tailscale08/05/2025
  • Scrapping Text menggunakan DiDOM di PHP05/05/2025
  • Hardisk Penuh :(26/04/2025
  • Memperbaiki Mouse Bejat 226/04/2025

cakedy.penamedia.com

  • Stuck
  • Masalah Masing-Masing
  • Kenaikan Emas yang Gila-gilaan
  • Bos Kecil
  • Sekolah vs Realitas

Copyright © 2025 Catatan Cak Edy.

Me WordPress Theme by themehall.com