এই প্রশ্নটির সমাধান করার জন্য আসল উদাহরণটি ধরুন take
আমার আমার ওএলসি ডেটাতে ওজনযুক্ত চলমান গড় গণনা করা দরকার, আমার কাছে প্রায় 134000 মোমবাতি রয়েছে যার জন্য প্রতিটি প্রতীক রয়েছে
- বিকল্প 1 পাইথন / নোড ইত্যাদিতে এটি করুন
- বিকল্প 2 এসকিউএল নিজেই এটি করুন!
কোনটা ভালো?
- মূলত পাইথনে এটি করতে হলে, আমাকে সবচেয়ে খারাপ অবস্থায় সমস্ত সঞ্চিত রেকর্ডগুলি আনতে হত, কেস করতে হবে, গণনা করাতে এবং সমস্ত কিছু ফিরিয়ে দিতে হবে যা আমার মতে আইওর এক বিশাল অপচয় নেই is
- আপনি যখনই একটি নতুন মোমবাতি পান ততবার ভারী চলমান গড় পরিবর্তনগুলি অর্থ আমি নিয়মিত বিরতিতে প্রচুর পরিমাণে আইও করবো যা আমার চিহ্নটিতে ভাল মত নয় meaning
- এসকিউএল-এ, আমাকে যা করতে হবে তা হ'ল সম্ভবত একটি ট্রিগার লিখতে হবে যা সমস্ত কিছুর গণনা করে এবং সঞ্চয় করে তাই এখন প্রতিটি জোড়ের জন্য চূড়ান্ত ডাব্লুএমএ মানগুলি আনতে হবে এবং এখনই এটি আরও দক্ষ
আবশ্যকতা
- আমি যদি প্রতিটি মোমবাতির জন্য ডাব্লুএমএ গণনা করতে এবং এটি সঞ্চয় করতে হয়, আমি পাইথনে এটি করব
- তবে যেহেতু আমার কেবল শেষ মানটি প্রয়োজন, তাই এসকিউএল পাইথনের চেয়ে অনেক দ্রুত
আপনাকে কিছুটা উত্সাহ দেওয়ার জন্য, ওয়েট মুভিং এভারেজ করতে এটি পাইথন সংস্করণ
ডাব্লুএমএ কোডের মাধ্যমে সম্পন্ন
import psycopg2
import psycopg2.extras
from talib import func
import timeit
import numpy as np
with psycopg2.connect('dbname=xyz user=xyz') as conn:
with conn.cursor() as cur:
t0 = timeit.default_timer()
cur.execute('select distinct symbol from ohlc_900 order by symbol')
for symbol in cur.fetchall():
cur.execute('select c from ohlc_900 where symbol = %s order by ts', symbol)
ohlc = np.array(cur.fetchall(), dtype = ([('c', 'f8')]))
wma = func.WMA(ohlc['c'], 10)
# print(*symbol, wma[-1])
print(timeit.default_timer() - t0)
conn.close()
এসকিউএল মাধ্যমে ডাব্লুএমএ
"""
if the period is 10
then we need 9 previous candles or 15 x 9 = 135 mins on the interval department
we also need to start counting at row number - (count in that group - 10)
For example if AAPL had 134 coins and current row number was 125
weight at that row will be weight = 125 - (134 - 10) = 1
10 period WMA calculations
Row no Weight c
125 1
126 2
127 3
128 4
129 5
130 6
131 7
132 8
133 9
134 10
"""
query2 = """
WITH
condition(sym, maxts, cnt) as (
select symbol, max(ts), count(symbol) from ohlc_900 group by symbol
),
cte as (
select symbol, ts,
case when cnt >= 10 and ts >= maxts - interval '135 mins'
then (row_number() over (partition by symbol order by ts) - (cnt - 10)) * c
else null
end as weighted_close
from ohlc_900
INNER JOIN condition
ON symbol = sym
WINDOW
w as (partition by symbol order by ts rows between 9 preceding and current row)
)
select symbol, sum(weighted_close)/55 as wma
from cte
WHERE weighted_close is NOT NULL
GROUP by symbol ORDER BY symbol
"""
with psycopg2.connect('dbname=xyz user=xyz') as conn:
with conn.cursor() as cur:
t0 = timeit.default_timer()
cur.execute(query2)
# for i in cur.fetchall():
# print(*i)
print(timeit.default_timer() - t0)
conn.close()
বিশ্বাস করুন বা না করুন, ক্যোয়ারী ওয়েট মুভিং অ্যাভারেজ করার খাঁটি পাইথন সংস্করণের চেয়ে দ্রুত চলে runs আমি এই ক্যোয়ারীটি লেখার জন্য ধাপে ধাপে গিয়েছিলাম তাই সেখানে থাকুন এবং আপনি ঠিকঠাক করবেন
গতি
0.42141127300055814 সেকেন্ড পাইথন
0.23801879299935536 সেকেন্ড এসকিউএল
আমার ডাটাবেসে আমার 134000 জাল ওএইচএলসি রেকর্ড রয়েছে যাতে এটি 1000 স্টকের মধ্যে বিভক্ত যাতে এসকিউএল যেখানে আপনার অ্যাপ্লিকেশন সার্ভারকে ছাড়িয়ে যায় তার উদাহরণ