Google Health API ডেডিকেটেড অ্যাগ্রিগেশন এন্ডপয়েন্ট প্রদান করে যা স্বাস্থ্য বিষয়ক রেকর্ডকে গ্রুপ করে এবং টাইম উইন্ডোতে সারসংক্ষেপ করে। ক্লায়েন্টে স্বতন্ত্র র ডেটা রেকর্ড উদ্ধার ও যোগ করার পরিবর্তে, রিকনসাইল করা ডেটা স্ট্রিমের উপর মেট্রিক (যেমন, মোট, গড়, ন্যূনতম ও সর্বাধিক) গণনা করতে এগ্রিগেশন এন্ডপয়েন্ট ব্যবহার করুন:
rollUpএন্ডপয়েন্ট সেকেন্ডে (windowSize) কনফিগার করা যায় এমন উইন্ডো ডিউরেশন ব্যবহার করে UTC-তে ফিজিক্যাল টাইম ইন্টারভ্যালে ডেটা পয়েন্ট অ্যাগ্রিগেট করে।dailyRollUpএন্ডপয়েন্ট ব্যবহারকারীর স্থানীয় ঘড়ির সাপেক্ষে সিভিল টাইম ব্যবহার করে এক বা একাধিক ক্যালেন্ডার দিন (windowSizeDays) জুড়ে ডেটা পয়েন্ট এগ্রিগেট করে।
দুটি এন্ডপয়েন্টই কানেক্ট করা ডিভাইস জুড়ে ওভারল্যাপ করা ডেটা পয়েন্ট অটোমেটিক রিকনসাইল করে এবং যেসব পরিধানযোগ্য ডেটার ধরন অন-রিস্ট শনাক্তকরণ ফিচারকে সমর্থন করে, সেগুলির জন্য অফ-রিস্ট পিরিয়ড বাদ দেয়।
অ্যাগ্রিগেশন এন্ডপয়েন্ট তুলনা করা
আপনার অ্যাপ্লিকেশন কীভাবে টাইম-সিরিজ স্বাস্থ্য মেট্রিক গ্রুপ করে এবং দেখায় তার সাথে মেলে এমন অ্যাগ্রিগেশন এন্ডপয়েন্ট বেছে নিন:
| ফিচার | rollUp এন্ডপয়েন্ট |
dailyRollUpটি এন্ডপয়েন্ট |
|---|---|---|
| HTTP অনুরোধ | POST https://health.googleapis.com/v4/users/me/dataTypes/data-type/dataPoints:rollUp |
POST https://health.googleapis.com/v4/users/me/dataTypes/data-type/dataPoints:dailyRollUp |
| সময় সংক্রান্ত উপস্থাপনা | UTC-তে ফিজিক্যাল টাইম (RFC 3339 ফর্ম্যাটে startTime ও endTime)। |
সিভিল টাইম (CivilDateTime অবজেক্ট হিসেবে start এবং end)। |
| উইন্ডো প্যারামিটার | windowSize (সেকেন্ডে স্ট্রিংয়ের প্রয়োজনীয় সময়সীমা, ন্যূনতম "1s")। |
windowSizeDays (ঐচ্ছিক পূর্ণসংখ্যা হিসেবে দিনের সংখ্যা, ডিফল্ট হিসেবে 1 সেট করা থাকে)। |
| রেসপন্স অবজেক্ট | RollupDataPoint |
DailyRollupDataPoint |
| উত্তর ক্রমানুসারে দেখান | বিপরীত-কালানুক্রমিক ক্রম (সবচেয়ে নতুন উইন্ডো প্রথমে)। | বিপরীত-কালানুক্রমিক ক্রম (সবচেয়ে নতুন উইন্ডো প্রথমে)। |
| যাদের জন্য সেরা | ইন্ট্রাডে চার্ট, ঘণ্টা বা মিনিট-লেভেল হিস্টোগ্রাম এবং নির্দিষ্ট-সময়কালের UTC বিশ্লেষণ। | দৈনিক ড্যাশবোর্ড, একাধিক দিনের ট্রেন্ড এবং সারাংশ যা টাইম জোন ট্রাভেল বা ডেলাইট সেভিং টাইমকে বিবেচনা করে। |
দুটি এন্ডপয়েন্টই ডেটার ধরনের উপর ভিত্তি করে সর্বাধিক কোয়েরি রেঞ্জের সীমা এনফোর্স করে:
calories-in-heart-rate-zone,heart-rate,active-minutesএবংtotal-calories-এর ক্ষেত্রে সর্বাধিক ১৪ দিনের কোয়েরি রেঞ্জ প্রযোজ্য।- অন্যান্য সব ধরনের ডেটার ক্ষেত্রে সর্বাধিক ৯০ দিনের কোয়েরি রেঞ্জ প্রযোজ্য।
কোন ডেটার ধরন rollup ও dailyRollup-কে সাপোর্ট করে তা চেক করতে, Google Health API ডেটার ধরন রেফারেন্স দেখুন।
ফিজিক্যাল সময় বিরতি অনুযায়ী অ্যাগ্রিগেট করা
rollUp
এন্ডপয়েন্ট ব্যবহার করে
সেকেন্ডে (windowSize) উইন্ডো সময়সীমা অনুযায়ী গ্রুপ করা ফিজিক্যাল সময় range (UTC-তে) জুড়ে ডেটা পয়েন্ট
এগ্রিগেট করুন।
rollUp এন্ডপয়েন্ট কল করার সময়, JSON অনুরোধের বডি প্রদান করুন যাতে
ক্লোজড-ওপেন range (startTime অন্তর্ভুক্ত, endTime বাদ দিয়ে) এবং
windowSize থাকে। নিম্নলিখিত windowSizeটি প্রয়োজনীয়তা মনে রাখবেন:
windowSizeসময়সীমা কমপক্ষে ১ সেকেন্ড ("1s") হতে হবে। API সাব-সেকেন্ড সময়সীমা, শূন্য বা নেগেটিভ সময়সীমা400 Bad Request(INVALID_ROLLUP_WINDOW) সমস্যার সাথে বাতিল করে দেয়।- সাব-বাকেট জুড়ে মোট ডেটার অসম বন্টন এড়াতে, এমন একটি
windowSizeবেছে নিন যা ডেটার ধরনের অন্তর্নিহিত স্টোরেজ রেজোলিউশনের সমান বা তার চেয়ে বড় (যেমন ১-মিনিট স্টেপ ইন্টারভ্যালের জন্য"60s")। বিস্তারিত জানতে, রোলআপ উইন্ডো ও স্টোরেজ রেজোলিউশন দেখুন।
যেমন, নিম্নলিখিত অনুরোধ ১-মিনিটের ব্যবধানে স্টেপ কাউন্ট রোল-আপ করে
(60s):
অনুরোধ করুন
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:rollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"startTime": "2026-02-17T17:00:00Z",
"endTime": "2026-02-17T17:59:59Z"
},
"windowSize": "60s"
}রেসপন্স
{
"rollupDataPoints": [
{
"startTime": "2026-02-17T17:55:00Z",
"endTime": "2026-02-17T17:56:00Z",
"steps": {
"countSum": "72"
}
},
{
"startTime": "2026-02-17T17:54:00Z",
"endTime": "2026-02-17T17:55:00Z",
"steps": {
"countSum": "85"
}
},
...
]
}ক্যালেন্ডারের দিন জুড়ে অ্যাগ্রিগেট করুন
একটি ক্যালেন্ডার দিন বা একাধিক দিন (windowSizeDays) জুড়ে ডেটা একত্রিত করতে
dailyRollUp
এন্ডপয়েন্ট ব্যবহার করুন।
অনুরোধের বডিতে
ক্লোজড-ওপেন সিভিল টাইম range (start এবং end) প্রদান করুন। ডেটার ধরনের উপর নির্ভর করে, এন্ডপয়েন্ট এগ্রিগেটেড ভ্যালু দেখায়, যেমন
প্রতিটি সিভিল উইন্ডোর যোগফল বা গড়।
যেহেতু dailyRollUp প্রতিটি ডেটা পয়েন্টের সাথে রেকর্ড করা UTC অফসেট ব্যবহার করে সিভিল টাইমে কাজ করে, তাই এটি ডেলাইট সেভিং টাইম ট্রানজিশন বা টাইম জোন জুড়ে ভ্রমণের কারণে দিনের দৈর্ঘ্যের পরিবর্তন অটোমেটিক অ্যাডজাস্ট করে।
যেমন, নিম্নলিখিত অনুরোধটি একটি সিভিল দিনে (windowSizeDays: 1) স্টেপ কাউন্ট একত্রিত করে:
অনুরোধ করুন
POST https://health.googleapis.com/v4/users/me/dataTypes/steps/dataPoints:dailyRollUp
Authorization: Bearer access-token
Accept: application/json
{
"range": {
"start": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 0,
"minutes": 0,
"seconds": 0,
"nanos": 0
}
},
"end": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59,
"nanos": 0
}
}
},
"windowSizeDays": 1
}রেসপন্স
{
"rollupDataPoints": [
{
"civilStartTime": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {}
},
"civilEndTime": {
"date": {
"year": 2026,
"month": 2,
"day": 26
},
"time": {
"hours": 23,
"minutes": 59,
"seconds": 59
}
},
"steps": {
"countSum": "3822"
}
}
]
}ডেটা সোর্স ফ্যামিলি অনুযায়ী অ্যাগ্রিগেট করুন
rollUp এবং dailyRollUp উভয়ই JSON অনুরোধের বডিতে একটি ঐচ্ছিক dataSourceFamily ফিল্ড গ্রহণ করে
যাতে নির্দিষ্ট সোর্স গ্রুপে অ্যাগ্রিগেশন সীমাবদ্ধ করা যায়:
users/me/dataSourceFamilies/all-sourcesবিকল্প (ডিফল্ট) সমস্ত রেজিস্টার করা ফার্স্ট-পার্টি এবং থার্ড-পার্টি সোর্স জুড়ে রিকনসাইল করা ডেটা এগ্রিগেট করে।users/me/dataSourceFamilies/google-wearablesবিকল্পটি Google এবং Fitbit পরিধানযোগ্য ট্র্যাকার ডিভাইসের মাধ্যমে রেকর্ড করা ডেটা একত্রিত করে, ম্যানুয়ালি লগ করা এবং ফোন-অনুমান করা ডেটা বাদ দিয়ে।users/me/dataSourceFamilies/google-sourcesবিকল্পটি পরিধানযোগ্য ট্র্যাকার, Health Connect এবং ফার্স্ট-পার্টি অ্যাপে ম্যানুয়াল এন্ট্রি সহ ফার্স্ট-পার্টি Google এবং Fitbit সোর্স থেকে ডেটা একত্রিত করে।
প্যারামিটার সংক্রান্ত সম্পূর্ণ প্রয়োজনীয়তা এবং অনুরোধ ও উত্তরের উদাহরণ দেখতে, ডেটা ফিল্টার করার নির্দেশিকায় ডেটা সোর্স ফ্যামিলি অনুযায়ী ফিল্টার করুন বিকল্প দেখুন।
রোলআপ উইন্ডো ও স্টোরেজ রেজোলিউশন
যদিও rollUp এন্ডপয়েন্ট ১ সেকেন্ড ("1s") বা তার বেশি সময়ের যেকোনও windowSize গ্রহণ করে, বিভিন্ন ধরনের ডেটা রেকর্ড এবং অন্তর্নিহিত স্টোরেজে বিভিন্ন স্যাম্পলিং রেট বা
ইন্টারভ্যাল সময়সীমা অনুযায়ী পরিমাপ বজায় রাখে। যেমন,
steps, distance,
active-minutes ও active-energy-burned-এর মতো পরিধানযোগ্য শারীরিক অ্যাক্টিভিটি মেট্রিক সাধারণত ১-মিনিট
(60s) অন্তর রেকর্ড করা হয়।
নিম্নলিখিত সারণীতে সাধারণ ডেটার ধরনের জন্য অন্তর্নিহিত স্টোরেজ রেজোলিউশন এবং ন্যূনতম
সাজেস্ট করা windowSize ভ্যালুর তালিকা দেওয়া হয়েছে:
| স্টোরেজ রেজোলিউশন | ন্যূনতম সাজেস্ট করা windowSize |
ডেটার প্রকার |
|---|---|---|
১ সেকেন্ড (1s) |
"1s" |
heart-rate |
১ মিনিট (60s) |
"60s" |
active-energy-burned, active-minutes, active-zone-minutes, altitude, calories-in-heart-rate-zone, distance, floors, steps, time-in-heart-rate-zone, total-calories |
ইন্টারভ্যাল ডেটার ধরন অ্যাগ্রিগেট করার সময়, rollUp এন্ডপয়েন্ট প্রতিটি রেকর্ড করা
ডেটা পয়েন্টকে সেই বাকেটে রাখে যেখানে ডেটা পয়েন্টের startTime থাকে। API
সাব-ইন্টারভাল বাকেটে ইন্টারভাল ডেটা স্লাইস, ইন্টারপোলেট বা ডিস্ট্রিবিউট করে না।
আপনি যদি এমন একটি windowSize উল্লেখ করেন যা অন্তর্নিহিত ডেটা স্টোরেজ
ইন্টারভ্যালের চেয়ে ছোট (যেমন, ১-মিনিট ইন্টারভ্যালে স্টোর করা steps-এর জন্য
১০-সেকেন্ডের উইন্ডোর অনুরোধ করা):
- প্রথম সাব-বাকেট যা ইন্টারভ্যালের
startTime-এর সাথে ম্যাচ করে (যেমন,10:00:00থেকে10:00:10) সেটি পুরো মিনিটের মোট গণনা পায় (যেমন, সেই মিনিটের জন্য রেকর্ড করা সব ১০০টি স্টেপ)। - একই মিনিটের মধ্যে বাকি সাব-বাকেট (
10:00:10থেকে10:00:20,10:00:20থেকে10:00:30এবং আরও অনেক) কোনও ডেটা পয়েন্ট পায় না, কারণ সেইসব উইন্ডোর মধ্যে কোনও ইন্টারভ্যাল শুরু হয় না।
এটি স্পাইকি ডেটা তৈরি করে যেখানে সম্পূর্ণ ইন্টারভ্যালের ভ্যালু প্রথম সাব-উইন্ডোতে কনসেনট্রেট করা থাকে, যেমনটি চিত্র ১-এ দেখানো হয়েছে।
সমানভাবে ডিস্ট্রিবিউট করা এবং অর্থপূর্ণ সমষ্টি পেতে, সবসময় windowSize-কে
টার্গেট ডেটা টাইপের (যেমন, steps-এর জন্য "60s" বা তার বেশি) অন্তর্নিহিত স্টোরেজ রেজোলিউশনের সমান বা তার বেশি সময়সীমাতে সেট করুন।
প্রতিটি ডেটা টাইপের স্টোরেজ রেজোলিউশন এবং ন্যূনতম সাজেস্ট করা রোলআপ উইন্ডোর জন্য, Google Health API ডেটা টাইপ রেফারেন্স দেখুন।
রেঞ্জ উইন্ডো সাইজের গুণিতক না হলে বাকেটিং করা
অনুরোধ করা রেঞ্জ windowSize (বা
windowSizeDays)-এর সঠিক গুণিতক না হলে, চূড়ান্ত কালানুক্রমিক বাকেট রেঞ্জের উপরের
এন্ডপয়েন্টে ট্রাঙ্কেট করা হয় এবং উইন্ডোর সাইজের চেয়ে কম সময় কভার করে। API
আপনার অনুরোধে কোনও পরিবর্তন না করেই তা গ্রহণ করে এবং রাউন্ডিং,
টাইম শিফ্ট বা ডেটা ইন্টারপোলেশন করে না।
অনুরোধ করা সম্পূর্ণ রেঞ্জ কভার করতে, API সিলিং ডিভিশন ব্যবহার করে অ্যাগ্রিগেশন উইন্ডোর মোট সংখ্যা গণনা করে:
Number of windows = ceiling(Range duration / Window size)
প্রতিটি বাকেট আপনার রেঞ্জের শুরু থেকে ক্রমানুসারে শুরু হয়। অন্য একটি সম্পূর্ণ সাইজের উইন্ডো যোগ করলে, সেটি যদি আপনার অনুরোধ করা শেষ সময় পেরিয়ে যায়, তাহলে শেষ উইন্ডোটি রেঞ্জের শেষ সময়ে ট্রাঙ্কেট (ক্ল্যাম্প) করা হয়।
বাকেটিং কীভাবে কাজ করে
আপনি অবিভাজ্য রেঞ্জ সহ রোলআপের অনুরোধ করলে, API নিম্নলিখিত নিয়মগুলি প্রয়োগ করে:
- আপনার অনুরোধ করা রেঞ্জের শুরু থেকে বাকেটিং শুরু হয়
(
range.startTimeবাrange.start) এবং উইন্ডো সাইজ (windowSizeবাwindowSizeDays) অনুযায়ী এগিয়ে যায়। - আপনার অনুরোধ করা রেঞ্জের (
range.endTimeবাrange.end) শেষে চূড়ান্ত কালানুক্রমিক বাকেটটি ক্ল্যাম্প করা হয়, যা অনুরোধ করা উইন্ডোর সাইজের চেয়ে কম সময় কভার করে। - ফেরত আসা
RollupDataPointবাDailyRollupDataPointঅবজেক্টে সেগুলির নিজস্ব স্পষ্ট শুরু ও শেষের টাইমস্ট্যাম্প অন্তর্ভুক্ত থাকে, যা আপনি ট্রাঙ্কেট করা বাকেটের আসল সময়সীমা পরীক্ষা করতে ব্যবহার করতে পারেন। - যেহেতু API বিপরীত-কালানুক্রমিক ক্রমে (সবচেয়ে নতুন
প্রথমে) রোলআপ ডেটা ফেরত দেয়, তাই চূড়ান্ত কালানুক্রমিক বাকেট (ট্রাঙ্কেট করা বাকেট)
ফেরত দেওয়া তালিকার প্রথম এলিমেন্ট (
index 0) হিসেবে দেখা যায়।
ছবি ২-এ দেখানো হয়েছে যে কীভাবে API range.startTime থেকে শুরু করে অবিভাজ্য রেঞ্জকে বাকেট করে,
range.endTime-এ শেষ বাকেটকে ক্ল্যাম্প করে এবং
ফলাফল হিসেবে পাওয়া বাকেটগুলিকে বিপরীত-কালানুক্রমিক ক্রমে রিটার্ন করে।
৫ মিনিটের উইন্ডো সহ ১২ মিনিটের রেঞ্জের উদাহরণ
ধরুন, কোনও ক্লায়েন্ট ৫ মিনিটের windowSize ("300s") সহ ১২ মিনিটের রেঞ্জে রোলআপের অনুরোধ করেছেন:
range.startTime-এর ভ্যালু হল10:00:00Z।range.endTime-এর ভ্যালু হল10:12:00Z, মোট ১২ মিনিট সময়সীমার জন্য।windowSize-এর ভ্যালু হল"300s"(৫ মিনিট)।
যেহেতু ১২ মিনিট ৫ মিনিটের (12 = 5 * 2 + 2) সঠিক গুণিতক নয়,
তাই API উইন্ডোর সংখ্যা ceiling(12 / 5) = 3 হিসেবে গণনা করে। এর ফলে তিনটি
ক্রমানুযায়ী বাকেট তৈরি হয়:
| বাকেট | বিরতি | সময়সীমা | উইন্ডোর স্ট্যাটাস |
|---|---|---|---|
| বাকেট ১ | [10:00:00Z, 10:05:00Z) |
৫ মিনিট | ফুল উইন্ডো |
| বাকেট ২ | [10:05:00Z, 10:10:00Z) |
৫ মিনিট | ফুল-উইন্ডো |
| বাকেট ৩ | [10:10:00Z, 10:12:00Z) |
২ মিনিট | range.endTime-এ ট্রাঙ্কেট করা হয়েছে |
এগ্রিগেটেড ভ্যালুর উপর প্রভাব
কারণ, চূড়ান্ত ক্রোনোলজিক্যাল উইন্ডোর সময়সীমা কম, তাই কম সময়সীমার কারণে ট্রাঙ্কেট করা বাকেটে অ্যাডিটিভ মেট্রিক (যেমন, ধাপের যোগফল বা গণনা) কম হয়।
কোনও ব্যবহারকারী যদি এই ১২ মিনিটের পুরো সময় জুড়ে প্রতি মিনিটে ১০০ পা হাঁটার স্থির গতি বজায় রাখেন, তাহলে বাকেটে নিম্নলিখিত মোট সংখ্যা থাকবে:
- Bucket ১ (
10:00:00Zথেকে10:05:00Z) ৫০০টি স্টেপ রেকর্ড করে (প্রতি মিনিটে ১০০টি স্টেপ হিসেবে ৫ মিনিট)। - বাকেট ২ (
10:05:00Zথেকে10:10:00Z) ৫০০ স্টেপ রেকর্ড করে (৫ মিনিট ধরে প্রতি মিনিটে ১০০ স্টেপ)। - Bucket 3 (
10:10:00Zথেকে10:12:00Z) ২০০টি স্টেপ রেকর্ড করে (প্রতি মিনিটে ১০০টি স্টেপ হিসেবে ২ মিনিট)।
৩ নম্বর বাকেটে ২০০ স্টেপের কম স্টেপ কাউন্ট হওয়ার কারণ হল ট্রাঙ্কেট করা উইন্ডোর ২ মিনিটের সময়সীমা, ব্যবহারকারীর অ্যাক্টিভিটি কমে যাওয়া নয়। এই ডেটা প্লট বা বিশ্লেষণ করার সময়, ব্যবহারকারীর অ্যাক্টিভিটিতে বিভ্রান্তিকর ড্রপ দেখানো এড়াতে প্রতিটি বাকেটের নির্দিষ্ট সময়কাল ব্যবহার করে গণনা স্বাভাবিক করুন।
চিত্র ৩-এ তিনটি বাকেট জুড়ে সময়কাল-স্বাভাবিকীকৃত হারের সাথে
র অ্যাডিশনাল স্টেপের মোট সংখ্যা (countSum) তুলনা করা হয়েছে।
অর্ডার দেখানো API রেসপন্সের উদাহরণ
API যেহেতু বিপরীত-কালানুক্রমিক ক্রমে ফলাফল দেখায়, তাই ট্রাঙ্কেট করা বাকেটটি দেখানো তালিকার প্রথম এলিমেন্ট হিসেবে দেখা যায়:
{
"rollupDataPoints": [
{
"startTime": "2026-08-20T10:10:00Z",
"endTime": "2026-08-20T10:12:00Z",
"steps": {
"countSum": "200"
}
},
{
"startTime": "2026-08-20T10:05:00Z",
"endTime": "2026-08-20T10:10:00Z",
"steps": {
"countSum": "500"
}
},
{
"startTime": "2026-08-20T10:00:00Z",
"endTime": "2026-08-20T10:05:00Z",
"steps": {
"countSum": "500"
}
}
]
}